Si la classe B
et la classe C
étendent la classe A
et que j'ai un objet de type B
ou C
, comment puis-je déterminer de quel type il s'agit d'une instance?
Si la classe B
et la classe C
étendent la classe A
et que j'ai un objet de type B
ou C
, comment puis-je déterminer de quel type il s'agit d'une instance?
Réponses:
if (obj instanceof C) {
//your code
}
if(!(obj instanceof C))
code
Child1 suivant child1 = new Child1 (); Parent1 parentChild = new Child2 (); Child2 child2 = nouveau Child2 (); (instance child1 de Parent1); (instance child1 de Child1); (instance parentChild de Child2); (instance parentChild de Parent1); (instance parentChild de Child1); code
, il peut effacer l'intention d'instanceof.
Utilisez Object.getClass () . Il renvoie le type d'exécution de l'objet.
Plusieurs bonnes réponses ont été présentées, mais il existe encore plus de méthodes: Class.isAssignableFrom()
et simplement essayer de lancer l'objet (ce qui pourrait jeter un ClassCastException
).
Résumons les différentes manières de tester si un objet obj
est une instance de type 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
manipulationIl existe cependant une différence de null
manipulation:
false
si obj
est null
( null
n'est pas une instance de quoi que ce soit).NullPointerException
évidemment.null
car null
peuvent être castées sur n'importe quel type!À retenir:
null
n'est pas une instance de n'importe quel type mais elle peut être convertie en n'importe quel type.
Class.getName()
ne doit pas être utilisé pour effectuer un test "is-instance-of" car si l'objet n'est pas de type C
mais une sous-classe de celui-ci, il peut avoir un nom et un package complètement différents (donc les noms de classe ne correspondront évidemment pas) mais il est toujours de type C
.Class.isAssignableFrom()
n'est pas symétrique : obj.getClass().isAssignableFrom(C.class)
retournerait false
si le type de obj
est une sous-classe de C
.Vous pouvez utiliser:
Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object
HTH. Mais je pense que la plupart du temps, ce n'est pas une bonne pratique de l'utiliser pour contrôler le flux ou quelque chose de similaire ...
Toute utilisation de l'une des méthodes suggérées est considérée comme une odeur de code basée sur une mauvaise conception OO.
Si votre design est bon, vous ne devriez pas avoir à utiliser getClass()
ou instanceof
.
N'importe laquelle des méthodes suggérées fera l'affaire, mais juste quelque chose à garder à l'esprit, au niveau de la conception.
Nous pouvons utiliser la réflexion dans ce cas
objectName.getClass().getName();
Exemple:-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getClass().getName();
}
Dans ce cas, vous obtiendrez le nom de la classe que l'objet passera à la HttpServletRequest
variable de référence d'interface.
obj.getClass()
renverra le nom de classe, préfixe par le motclass
request.getClass().getName();
imprime tout le paquet! avec le nom de la classe
Il existe également une .isInstance
méthode sur la Class
classe " ". si vous obtenez la classe d'un objet via, myBanana.getClass()
vous pouvez voir si votre objet myApple
est une instance de la même classe que myBanana
via
myBanana.getClass().isInstance(myApple)
vérifier avec isinstance()
ne serait pas suffisant si vous voulez savoir en temps d'exécution. utilisation:
if(someObject.getClass().equals(C.class){
// do something
}
J'utilise la fonction Blow dans ma classe GeneralUtils, vérifiez qu'elle peut être utile
public String getFieldType(Object o) {
if (o == null) {
return "Unable to identify the class name";
}
return o.getClass().getName();
}
J'ai utilisé des génériques Java 8 pour obtenir l'instance d'objet au moment de l'exécution plutôt que d'avoir à utiliser un commutateur
public <T> void print(T data) {
System.out.println(data.getClass().getName()+" => The data is " + data);
}
passez n'importe quel type de données et la méthode imprimera le type de données que vous avez passé lors de son appel. par exemple
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);
Voici la sortie
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 []