Tengo una clase Child
que se extiende Parent
.¿El instanceof devuelve true si instancia de un padre?
Parent child = new Child();
if (child instanceof Parent){
// Do something
}
¿Esto devuelve verdadero o falso, y por qué?
Tengo una clase Child
que se extiende Parent
.¿El instanceof devuelve true si instancia de un padre?
Parent child = new Child();
if (child instanceof Parent){
// Do something
}
¿Esto devuelve verdadero o falso, y por qué?
Yes, lo haría. ¿Y por qué no?
Porque child es, de hecho, una instancia de Parent. Si, desea llevar a cabo una operación para un niño debe comprobar
if (child instanceof Child){
}
Sin embargo, debe recordar lo siguiente declaración de efectivo de C++, por Scott Meyers:
"Cada vez que se encuentre escribiendo código de la forma "si el objeto es de tipo T1 , a continuación, hacer algo, pero si es de tipo T2, a continuación, hacer algo otra cosa," bofetada a sí mismo.
, que creo que también se aplica en este caso. Si quiere doSomething según el tipo de clase al que pertenece el objeto al que se hace referencia, la siguiente estructura de código debería ayudarlo.
NOTA: No lo he compilado.
class Parent {
public void doSomething() {
System.out.println("I am the Parent, and I do as I like");
}
}
class ChildA extends Parent {
public void doSomething() {
System.out.println("I am a child named A, but I have my own ways, different from Parent");
}
}
class ChildB extends Parent {
public void doSomething() {
System.out.println("I am a child named B, but I have my own ways, different from my Parent and my siblings");
}
}
public class Polymorphism101 {
public static void main() {
Parent p = new Parent();
p.doSomething();
p = new ChildA();
p.doSomething();
p = new ChildB();
p.doSomething();
}
}
instanceof devolverá true si se trata de una subclase ...
supuesto que devuelve cierto porque los niños es una instancia de la matriz
Sí. instanceof
será verdadero siempre que la referencia (lado izquierdo de la expresión instanceof
) se pueda convertir al ReferenceType (el tipo en el lado derecho de la expresión instanceof
). Esto será cierto para las subclases en relación con sus padres:
Child child = new Child();
Parent parent = (Parent) child; //works!
assert child instanceof Parent; //true
De The Java Language Specification, Java SE 9 Edition:
15.20. Relational Operators
...
RelationalExpression instanceof ReferenceType15.20.2. Type Comparison Operator instanceof
...
En tiempo de ejecución, el resultado del operadorinstanceof
estrue
si el valor de la RelationalExpression no esnull
y la referencia podría ser arrojado a la ReferenceType sin levantar unClassCastException
. De lo contrario, el resultado esfalse
.
pero determino el tipo de objeto en tiempo de ejecución y necesito definir una referencia principal para contener todos los tipos de elementos secundarios. ¿Cómo puedo hacer eso de la otra manera? – ikbal
@ user479129: Puede mantener una referencia a cualquiera de los hijos del padre en una referencia de tipo padre. Es decir, si hay una 'clase Parent {}' y 'clase ChildA extends Parent' y' class ChildB extends Parent' entonces puedes usar 'Parent p' para referir un objeto de tipo' ChildA' o 'ChildB', pero yo no entiendas lo que quieres decir a la inversa. –
Necesito controlar ese objeto p es un tipo de su hijo, no el padre. en algunos casos puede ser del tipo padre, así que necesito verificar que sea exactamente del tipo que quiero. eso es lo que quiero. Espero que esté claro – ikbal