2012-02-07 12 views
19
public class TableModel2 extends TableModel1 { ... } 

TableModel2 tableModel = new TableModel2(); 

boolean t1 = tableModel instanceof TableModel1; 
boolean t2 = tableModel instanceof TableModel2; 

En el ejemplo anterior, t1 y t2 son true. Entonces, ¿cómo podría diferenciar entre TableModel1 y TableModel2 usando instanceof?Ejemplo de'instanceof'

Respuesta

16
boolean t2 = tableModel.getClass().equals(TableModel1.class); //False 
boolean t2 = tableModel.getClass().equals(TableModel2.class); //True 
+0

Siempre que se agregue la comprobación NULL para tableModel antes de hacer esto, donde como instanceof no lo requiere. –

1

Bueno, no creo que puedas. Desde la perspectiva de herencia tableModel es referencia válida para ambos tipos, por lo que instanceof devolverá verdadero en ambos casos.

4

No puede. Si usted realmente necesita para distinguir una de otra, utilizar tableModel.getClass() lugar, como en:

boolean t1 = tableModel.getClass() == TableModel1.class; 
boolean t2 = tableModel.getClass() == TableModel2.class; 

Nota pesar de que está deliberadamente tratando de romper uno de los principios fundadores de la programación orientada a objetos, así que asegúrese de que no se puede evitar este truco antes usarlo en un código real.

7

Entonces, ¿cómo podría diferenciar entre TableModel1 y TableModel2 usando instanceof?

Técnicamente, se puede comprobar que tableModel es una instancia de TableModel1 y no y la instancia de TableModel2:

(tableModel instanceof TableModel1) && !(tableModel instanceof TableModel2) 

Sin embargo, me gustaría animaros en los términos más fuertes posibles para evitar cualquier código que se basa en el resultado de instanceof o getClass(). Tal código es muy frágil frente a cambios futuros. Si te encuentras haciendo algo en esta línea, es una buena pista de que puede ser un buen momento para volver a visitar tu diseño.

+0

Qué ocurre si agrego 'TableModel3'? 'TableModel25'? – alf

19

No puede hacerlo con instanceof, pero se puede hacer con getClass:

boolean t1 = tableModel.getClass().equals(TableModel1.class); 
boolean t2 = tableModel.getClass().equals(TableModel2.class); 

El operador instanceof está destinado para el control de la jerarquía de clases hasta el final, hasta el java.lang.Object, incluyendo los controles para todas las interfaces . Le permite saber si una instancia del objeto que tiene se puede convertir al tipo que ha especificado sin activar la excepción de lanzamiento de clase.

getClass, por el contrario, devuelve la clase específica del objeto dado.

5

instancia de significa "es una".

TableModel2 IS A TableModel1. 
But TableModel1 IS NOT A TableModel2. 
so 

package main; 

public class TempClass { 
    public static void main(String[] args) { 
     TableModel1 tableModel1 = new TableModel1(); 
     TableModel1 tableModel2 = new TableModel2(); 

     System.out.println(tableModel1 instanceof TableModel1); 
     System.out.println(tableModel1 instanceof TableModel2); 

     System.out.println(tableModel2 instanceof TableModel1); 
     System.out.println(tableModel2 instanceof TableModel2); 
    } 

    public static class TableModel1 { 
    } 

    public static class TableModel2 extends TableModel1 { 
    } 
} 

true 
false 

true 
true 
+0

public class TableModel2 extends TableModel1 {...} Por lo tanto, "instanceOf" no funciona aquí –

+0

tableModel1 y tableModel2 son ambos TableModel1. Así que instancia de dar verdad. Pero tableModel1 NO ES un TableModel2. – kornero

1

fácil, uso nombres de las clases:

public class Test 
{ 
    public class TableModel1 
    { 
    }; 

    public class TableModel2 extends TableModel1 
    { 
    }; 

    public TableModel2 tableModel = new TableModel2(); 

    public static void main(String[] args) 
    { 
     Test t = new Test(); 
     System.out.println("t1=" + t.tableModel.getClass().equals(TableModel1.class)); 
     System.out.println("t2=" + t.tableModel.getClass().equals(TableModel2.class)); 
    } 
}