/ / ¿Cómo funciona la herencia con cada uno de los bucles? - java, herencia, foreach

¿Cómo funciona la herencia con cada uno de los bucles? - java, herencia, foreach

¿Cómo funciona la herencia en relación con un bucle para cada uno? Imagina que tengo dos clases: SubClass y SuperClass, y tengo los siguientes ArrayList.

/**
* Containes both SuperClass and SubClass instances.
*/
ArrayList<SuperClass> superClasses = new ArrayList<SuperClass>();

¿Es posible iterar sobre superClasses de tal manera que solo seleccione subClasses.

El seguimiento:

for(SubClass subClass : superClasses){
// Do Foo
}

no hace esto Lo siguiente es lo único que podría ponerme a trabajar:

for(SuperClass superClass : superClasses){
if(superClass instanceof SubClass){
// Do Foo
}
}

Sin embargo no quiero usar instanceof A menos que sea absolutamente necesario, como sigo leyendo.En todas partes (StackOverflow, Oracle Tutorials, etc.) casi siempre se puede encontrar una mejor solución que aumente la encapsulación. ¿Hay una forma más elegante de hacer esto?

Respuestas

5 para la respuesta № 1

Bueno, podrías escribir un método de ayuda para ocultar el instanceof prueba... Guayaba Tiene un método como este, por ejemplo, en Iterables.filter, que podrías usar así:

for (SubClass subclass : Iterables.filter(superclasses, SubClass.class)) {
...
}

Es solo moviendo el instanceof Verifique realmente, no es deshacerse de él. Fundamentalmente usted necesitar Ese cheque, porque algo tiene que hacer el filtrado.


2 para la respuesta № 2

El primer enfoque (for (SubClass subClass : superClasses)) no puede funcionar ya que el compilador no puede garantizar que solo haya objetos de tyoe SubClass ahí.

En Java (sin bibliotecas externas) no es posible preseleccionar en el Class. Por lo tanto, el instanceof Es la forma normal de hacer esto.


1 para la respuesta № 3

instanceof Funcionaría absolutamente bien en esta situación. Pero si realmente tiene razones para no usarlo, siempre podría darle alguna variable a la superclase, Boolean skipMe = true, y cambia eso a falso en la subclase si quisieras.

Pero sugiero usar instanceof


0 para la respuesta № 4

Recomiendo administrar una lista separada que solo contenga instancias de subclases, si es posible.