À quoi sert l' instanceof
opérateur? J'ai vu des trucs comme
if (source instanceof Button) {
//...
} else {
//...
}
Mais rien de tout cela n'avait de sens pour moi. J'ai fait mes recherches, mais je n'ai trouvé que des exemples sans aucune explication.
java
instanceof
Ben
la source
la source
instanceof
lors de la substitutionequals
?Réponses:
instanceof
mot-clé est un opérateur binaire utilisé pour tester si un objet (instance) est un sous-type d'un type donné.Imaginer:
Imaginez un
dog
objet , créé avecObject dog = new Dog()
, puis:Cependant, avec
Object animal = new Animal();
,parce que
Animal
c'est un supertypeDog
et peut-être moins «raffiné».Et,
En effet, ce
Dog
n'est ni un sous-type ni un supertype deCat
, et il ne l'implémente pas non plus.Notez que la variable utilisée
dog
ci-dessus est de typeObject
. Il s'agit de montrer qu'ilinstanceof
s'agit d'une opération d' exécution et nous amène à un cas d'utilisation: réagir différemment en fonction d'un type d'objets à l'exécution .Choses à noter:
expressionThatIsNull instanceof T
est faux pour tous les typesT
.Bon codage.
la source
Object dog = new Dog(); System.out.println(dog instanceof Cat);
. Cela compile très bien et imprimefalse
. Le compilateur n'est pas autorisé à déterminer au moment de la compilation quidog
ne peut pas être un Cat (selon les règles du JLS)boolean b = "foo" instanceof Integer;
Object indirect = ...; if (indirect instanceof Something)
. Il ne s'agit pas de ceif (literal instanceof Something)
que vous semblez supposer.Object dog
partie. Ma faute!dog instanceof Cat // does not even compile!
(parce que c'est une classe). SiCat
c'était une interface, elle compilerait.C'est un opérateur qui renvoie true si le côté gauche de l'expression est une instance du nom de classe sur le côté droit.
Pensez-y de cette façon. Disons que toutes les maisons de votre pâté de maisons ont été construites à partir des mêmes plans. Dix maisons (objets), un ensemble de plans (définition de classe).
instanceof
est un outil utile lorsque vous avez une collection d'objets et que vous n'êtes pas sûr de ce qu'ils sont. Disons que vous avez une collection de contrôles sur un formulaire. Vous voulez lire l'état vérifié de toutes les cases à cocher présentes, mais vous ne pouvez pas demander à un objet ancien ordinaire son état vérifié. Au lieu de cela, vous verriez si chaque objet est une case à cocher, et si c'est le cas, le castez en case à cocher et vérifiez ses propriétés.la source
instanceof
peut rendre l'abattage sans danger.Comme décrit sur ce site :
J'espère que ça aide!
la source
Cet opérateur vous permet de déterminer le type d'un objet. Il renvoie une
boolean
valeur.Par exemple
la sortie est:
la source
If
source
est uneobject
variable,instanceof
est un moyen de vérifier si c'est uneButton
ou non.la source
Comme mentionné dans d'autres réponses, l'utilisation typique canonique de
instanceof
est pour vérifier si un identifiant fait référence à un type plus spécifique. Exemple:Notez cependant que le type de l'expression de gauche doit être un type parent de l'expression de droite (voir JLS 15.20.2 et Java Puzzlers, # 50, pp114 ). Par exemple, la compilation des éléments suivants échouera:
Cela échoue à compiler avec le message:
Comme
Test
n'est pas une classe parente deString
. OTOH, cela compile parfaitement et imprimefalse
comme prévu:la source
la source
Peut être utilisé comme un raccourci dans le contrôle d'égalité.
la source
La plupart des gens ont correctement expliqué le «quoi» de cette question, mais personne n'a expliqué correctement le «comment».
Voici donc une illustration simple:
Les sorties:
La raison de l'erreur du compilateur lors de la comparaison
s
avec StringBuffer est bien expliquée dans la documentation :ce qui implique que le LHS doit être une instance de RHS ou d'une classe qui implémente RHS ou étend RHS.
Comment utiliser alors use instanceof?
Étant donné que chaque classe étend Object, la conversion de type LHS en objet fonctionnera toujours en votre faveur:
Les sorties:
la source
if ((Object)s instanceof StringBuffer) System.out.println("Instance of StringBuffer"); //shouldn't this be true
, puisque nous sommes en train de transtyper s en Object?http://download.oracle.com/javase/tutorial/java/nutsandbolts/op2.html
la source
L'instance de mot-clé est utile lorsque vous souhaitez connaître l'instance d'un objet particulier.
Supposons que vous lancez une exception et que vous avez catch, effectuez une opération personnalisée de somme, puis continuez à nouveau selon votre logique (throws ou journal, etc.)
Exemple: 1) L'utilisateur a créé l'exception personnalisée "InvalidExtensionsException" et la lance selon la logique
2) Maintenant dans catch block catch (Exception e) {exécute une logique de somme si le type d'exception est "InvalidExtensionsException"
3) Si vous ne vérifiez pas l'instance et le type d'exception est une exception de pointeur Null, votre code sera interrompu.
Donc, votre logique devrait être à l'intérieur de l'instance de if (e instanceof InvalidExtensionsException) {InvalidExtensionsException InvalidException = (InvalidExtensionsException) e; }
L'exemple ci-dessus est une mauvaise pratique de codage.Cependant, cet exemple vous aide à comprendre l'utilisation de l'instance de celui-ci.
la source
La meilleure explication est jls . Essayez toujours de vérifier ce que dit la source. Là, vous obtiendrez la meilleure réponse et bien plus encore. Reproduire certaines parties ici:
la source
L'
instanceof
opérateur java est utilisé pour tester si l'objet est une instance du type spécifié (classe ou sous-classe ou interface).L'instance de java est également connue sous le nom de type
comparison operator
car elle compare l'instance avec le type. Il renvoie soittrue
oufalse
. Si nous appliquons l'instanceof
opérateur avec n'importe quelle variable qui anull
valeur, il retournefalse
.À partir de JDK 14+ qui comprend JEP 305, nous pouvons également faire de la «correspondance de modèles»
instanceof
Les modèles testent essentiellement qu'une valeur a un certain type et peuvent extraire des informations de la valeur lorsqu'elle a le type correspondant. La correspondance de modèles permet une expression plus claire et plus efficace de la logique commune dans un système, à savoir la suppression conditionnelle de composants d'objets.
Avant Java 14
Améliorations de Java 14
Nous pouvons également combiner le contrôle de type et d'autres conditions ensemble
L'utilisation de la correspondance de motifs dans
instanceof
devrait réduire le nombre total de transtypages explicites dans les programmes Java.PS :
instanceOf
ne correspondra que lorsque l'objet n'est pas nul, alors seul il peut être attribuéstr
.la source
la source
Exemple de code très simple:
Soyez prudent ici. Dans l'exemple ci-dessus, si Class1 est Object, la première comparaison sera toujours vraie. Ainsi, tout comme avec des exceptions, l'ordre hiérarchique est important!
la source
Vous pouvez utiliser Map pour faire une abstraction plus élevée sur l'instance de
Ensuite, une telle carte lui ajoute une action:
Ensuite, avec un objet de type inconnu, vous pouvez obtenir une action spécifique de cette carte:
la source
L'opérateur instanceof est utilisé pour vérifier si l'objet est une instance du type spécifié. (classe ou sous-classe ou interface).
L'instanceof est également connue sous le nom d'opérateur de comparaison de type car elle compare l'instance avec le type. Il renvoie vrai ou faux.
Si nous appliquons l'opérateur instanceof avec n'importe quelle variable qui a une valeur nulle, il retourne false.
la source