instanceof
Le mot clé est un opérateur binaire utilisé pour tester si un objet (instance) est un sous-type d'un Type donné.
Imaginez :
interface Domestic {}
class Animal {}
class Dog extends Animal implements Domestic {}
class Cat extends Animal implements Domestic {}
Imaginez un dog
objet créé avec Object dog = new Dog()
alors :
dog instanceof Domestic // true - Dog implements Domestic
dog instanceof Animal // true - Dog extends Animal
dog instanceof Dog // true - Dog is Dog
dog instanceof Object // true - Object is the parent type of all objects
Cependant, avec Object animal = new Animal();
,
animal instanceof Dog // false
parce que Animal
est un supertype de Dog
et peut-être moins "raffiné".
Et,
dog instanceof Cat // does not even compile!
Cela s'explique par le fait que Dog
n'est ni un sous-type ni un supertype de Cat
et il ne la met pas non plus en œuvre.
Notez que la variable utilisée pour dog
ci-dessus est de type Object
. Ceci pour montrer instanceof
es un temps de fonctionnement et nous amène à un/des cas d'utilisation : réagir différemment en fonction du type d'objet au moment de l'exécution. .
Des choses à noter : expressionThatIsNull instanceof T
est faux pour tous les types T
.
43 votes
Il n'y a rien de mal à poser des questions ici, mais si vous apprenez Java, vous devriez peut-être vous procurer un livre. N'importe quel livre Java décent aurait la réponse à cette question et aux 1000 suivantes que vous allez avoir.
0 votes
Un tel opérateur a de nombreuses utilisations spécifiques. Il s'agirait d'une question spécifique si elle demandait une explication pour l'un des exemples qui n'a pas de sens pour vous.
3 votes
Les réponses ci-dessous sont correctes, mais notez que instanceof est un opérateur surutilisé ; 9 fois sur 10, il peut être remplacé par une utilisation correcte du polymorphisme (pas toujours, mais souvent).
0 votes
J'irais même plus loin que Richard : je n'ai JAMAIS vu une utilisation valide de instanceof. Il n'est utile que pour des bidouillages rapides sur un code mal conçu. Si vous n'aimez pas la POO, écrivez dans un autre langage (il y en a beaucoup). Dites simplement "non" à instanceof !
5 votes
@ScottBiggs Existe-t-il une bonne alternative aux
instanceof
lorsque l'on remplaceequals
?0 votes
@BenAaronson J'ai l'impression que Scott et Richard prennent une règle spécifique des écritures religieuses et l'appliquent trop largement à la vie quotidienne. :) Instanceof ne devrait être utilisé que lorsque vous êtes forcé pour travailler avec des objets de type inconnu. Si vous devez utiliser instanceof avec des types connus, entonces c'est un signe de mauvaise conception. Comme d'habitude, les textes religieux oublient commodément que parfois la vie nous oblige à utiliser du mauvais code écrit par de mauvaises personnes et qu'il n'y a absolument rien que l'on puisse faire (à part utiliser instanceof). Ainsi, instanceof est tout à fait acceptable dans la méthode equals.
0 votes
Bien qu'il y ait plusieurs réponses qui sont syntaxiquement correctes sur comment il peut être utilisé. Ce sont de mauvais choix par rapport au polymorphisme. C'est comme le goto, il y a beaucoup de cas valables où il peut être utilisé, mais dans la plupart des cas, il y a objectivement de meilleures façons de le faire.