Se class Be class Cestendono class Ae ho un oggetto di tipo Bo C, come posso determinare di quale tipo è un'istanza?
Se class Be class Cestendono class Ae ho un oggetto di tipo Bo 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) {
}
nullgestioneC'è una differenza nella nullgestione però:
falseif objis null( nullnon è un'istanza di nulla).NullPointerExceptionovviamente lanciato .nullperché nullpossono essere lanciati su qualsiasi tipo!Da ricordare:
nullnon è 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 Cma 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 falsese 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 HttpServletRequestvariabile 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 .isInstancemetodo sulla Classclasse " ". se ottieni la classe di un oggetto tramite myBanana.getClass()puoi vedere se il tuo oggetto myAppleè un'istanza della stessa classe di myBananavia
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 []