Perdóneme si me falta algún núcleo de Java aquí.
Yo estaba buscando a través HashSet
javadocs 's para la especificación de ella de implementación de Collection.containsAll()
y, al parecer, hereda la aplicación por AbstractCollection
la cual de acuerdo a la documentación de código fuente del JDK 8 dice así:
public boolean containsAll(Collection<?> c) {
for (Object e : c)
if (!contains(e))
return false;
return true;
}
Mi pregunta surge del hecho de que, si bien HashSet
no anula containsAll()
Sin embargo, sí anular contains()
:
public boolean contains(Object o) {
return map.containsKey(o);
}
AbstractCollection
igualmente:
public boolean contains(Object o) {
Iterator<E> it = iterator();
if (o==null) {
while (it.hasNext())
if (it.next()==null)
return true;
} else {
while (it.hasNext())
if (o.equals(it.next()))
return true;
}
return false;
}
Mi opinión ha sido que cuando una llamada miembro de instancia no se especifica explícitamente dentro de la instancia, la JVM implícitamente lo reemplaza con this.instanceMemberCall()
que en este caso se traduciría en AbstractCollection
's contains()
que se llama. Pero, de nuevo he leído aquí que la complejidad del tiempo de HashMap
/ HashSet
's containsAll()
sería O (n) lo que sugiere que HashSet
' s contains()
(O (1)) se llama. Apreciaría un poco de claridad en cuanto a lo de la semántica reales detrás de esto son.
No, esto no es más que el polimorfismo. Cada vez que se invoca un método en un objeto, el verdadero tipo de objeto que importa, nada más.
Significado: no importa que foo()
se implementa en la base. Cuando foo()
las llamadas bar()
con bar()
ser manipulables en Child. Cuando se tiene un objeto secundario, entonces siempre será el niño bar()
versión que es llamada.
En su ejemplo, this
no es AbstractSet, es HashSet
!
O, de nuevo, en otras palabras: no importa "donde" se invoca un método. Lo que importa es el tipo de objeto que se invoca en. Y como se ha dicho, el objeto es de tipo HashSet!