Gracias Alex por venir en nuestro auxilio.
Perfecto entonces, y muy interesante lo que nos revelas acerca de los algoritmos de comprobación de tipos, es como mirar por la rendija la propia cocina del compilador.
Tengo una consulta que me surge respecto de lo que me sugieres cuando dices:
Otra cosa, esta declaración:
ArrayList<Set> miLista; // Declaración de los objetos.
HashSet<String> objHashSet;
TreeSet<Integer> objTreeSet;
Es más adecuada así:
List<Set> miLista; // Declaración de los objetos.
Set<String> objHashSet;
Set<Integer> objTreeSet;
Entiendo que iré captando y asimilando las bondades y beneficios del polimorfismo conforme vaya avanzando en las posteriores Lecciones y ejercitaciones, pero por lo pronto -y por las comprobaciones que realicé en virtud de tu sugerencia- puedo advertir algo y corrígeme si estoy equivocado.
Al declarar e instanciar el objeto miLista de la siguiente manera:
ArrayList<Set> miLista;
miLista = new ArrayList<Set>;
el objeto miLista podrá usar tanto los métodos correspondientes a la clase ArrayList, como los métodos correspondientes a la interface List, por ser la interface List implementada por la clase ArrayList, cierto?
Ahora bien, si en cambio el objeto miLista fuera declarado e instanciado de la siguiente manera:
List<Set> miLista;
miLista = new ArrayList<Set>;
el objeto miLista podrá usar solo los métodos de la interface Set, pero no los métodos de la clase ArrayList, cierto?.
¿Es correcto lo que digo? A simple vista sería como un "mal negocio" pero sospecho que los beneficios vienen por otro lado que por ahora no visualizo.
Hasta este momento veo como beneficio que un objeto declarado como List podrá recibir como argumento todo objeto cuya clase implemente la interface List (que no es poca cosa).