Se class B
e class C
estendono class A
e ho un oggetto di tipo B
o C
, come posso determinare di quale tipo è un'istanza?
Se class B
e class C
estendono class A
e ho un oggetto di tipo B
o C
, come posso determinare di quale tipo è un'istanza?
Risposte:
if (obj instanceof C) {
//your code
}
if(!(obj instanceof C))
code
Child1 child1 = new Child1 (); Parent1 parentChild = new Child2 (); Child2 child2 = new Child2 (); (child1 istanza di Parent1); (child1 istanza di Child1); (istanza parentChildof Child2); (parentChild instanceof Parent1); (istanza parentChildof Child1); code
, può chiarire l'intento di instanceof.
Usa Object.getClass () . Restituisce il tipo di runtime dell'oggetto.
Sono state presentate più risposte a destra, ma ci sono ancora più metodi: Class.isAssignableFrom()
e semplicemente tentando di lanciare l'oggetto (che potrebbe lanciare a ClassCastException
).
Riassumiamo i modi possibili per verificare se un oggetto obj
è un'istanza di tipo C
:
// Method #1
if (obj instanceof C)
;
// Method #2
if (C.class.isInstance(obj))
;
// Method #3
if (C.class.isAssignableFrom(obj.getClass()))
;
// Method #4
try {
C c = (C) obj;
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
// Method #5
try {
C c = C.class.cast(obj);
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
null
gestioneC'è una differenza nella null
gestione però:
false
if obj
is null
( null
non è un'istanza di nulla).NullPointerException
ovviamente lanciato .null
perché null
possono essere lanciati su qualsiasi tipo!Da ricordare:
null
non è un'istanza di alcun tipo ma può essere trasmessa a qualsiasi tipo.
Class.getName()
non dovrebbe essere usato per eseguire un test "is-instance-of" poiché l'oggetto non è di tipo C
ma una sua sottoclasse, potrebbe avere un nome e un pacchetto completamente diversi (quindi i nomi delle classi ovviamente non corrisponderanno) ma è ancora di tipo C
.Class.isAssignableFrom()
non è simmetrico : obj.getClass().isAssignableFrom(C.class)
ritornerebbe false
se il tipo di obj
è una sottoclasse di C
.Puoi usare:
Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object
HTH. Ma penso che la maggior parte delle volte non sia una buona pratica usarlo per il flusso di controllo o qualcosa di simile ...
Qualsiasi utilizzo di uno qualsiasi dei metodi suggeriti è considerato un odore di codice basato su un cattivo design OO.
Se il tuo design è buono, non dovresti trovarti a dover usare getClass()
o instanceof
.
Qualunque dei metodi suggeriti farà, ma solo qualcosa da tenere a mente, dal punto di vista del design.
In questo caso possiamo usare la riflessione
objectName.getClass().getName();
Esempio:-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getClass().getName();
}
In questo caso otterrai il nome della classe quale oggetto passa alla HttpServletRequest
variabile di riferimento dell'interfaccia.
obj.getClass()
restituirà className, prefixex con la parolaclass
request.getClass().getName();
stampa tutto il pacchetto! insieme al nome della classe
C'è anche un .isInstance
metodo sulla Class
classe " ". se ottieni la classe di un oggetto tramite myBanana.getClass()
puoi vedere se il tuo oggetto myApple
è un'istanza della stessa classe di myBanana
via
myBanana.getClass().isInstance(myApple)
verificare con isinstance()
non sarebbe sufficiente se si desidera sapere in fase di esecuzione. uso:
if(someObject.getClass().equals(C.class){
// do something
}
Uso la funzione di soffiaggio nella mia classe GeneralUtils, controllo che possa essere utile
public String getFieldType(Object o) {
if (o == null) {
return "Unable to identify the class name";
}
return o.getClass().getName();
}
Ho usato i generici Java 8 per ottenere qual è l'istanza dell'oggetto in fase di runtime piuttosto che dover usare switch case
public <T> void print(T data) {
System.out.println(data.getClass().getName()+" => The data is " + data);
}
passare qualsiasi tipo di dati e il metodo stamperà il tipo di dati passati durante la chiamata. per esempio
String str = "Hello World";
int number = 10;
double decimal = 10.0;
float f = 10F;
long l = 10L;
List list = new ArrayList();
print(str);
print(number);
print(decimal);
print(f);
print(l);
print(list);
Di seguito è l'output
java.lang.String => The data is Hello World
java.lang.Integer => The data is 10
java.lang.Double => The data is 10.0
java.lang.Float => The data is 10.0
java.lang.Long => The data is 10
java.util.ArrayList => The data is []