Dans quel cas l'opérateur' instanceof ' est-il utilisé en Java?

dans quel cas l'opérateur instanceof est-il utilisé? J'ai vu des trucs comme

if (source instanceof Button) {
    //...
} else {
    //...
}

mais ça n'avait aucun sens pour moi. J'ai fait mes recherches, mais je n'ai trouvé que des exemples sans aucune explication.

141
demandé sur Pacerier 2011-09-06 03:28:13

16 réponses

instanceof mot-clé est un opérateur binaire utilisé pour tester si un objet (exemple) 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() , puis:

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!

c'est parce que Dog n'est ni un sous-Type ni un super-type de Cat , et il ne l'applique pas non plus.

noter que la variable utilisée pour dog ci-dessus est du type Object . C'est pour montrer instanceof est un runtime opération et nous amène à un/des cas d'utilisation: réagir différemment selon un type d'objet à l'exécution .

choses à noter: expressionThatIsNull instanceof T est faux pour tous les Types T .

Heureux de codage.

207
répondu Cache Staheli 2017-03-06 01:09:12

c'est un opérateur qui renvoie true si le côté gauche de l'expression est une instance de le nom de classe sur le côté droit.

Pensez-y de cette façon. Dites que toutes les maisons de votre quartier ont été construites à partir des mêmes plans. Dix maisons (objets), un ensemble de plans (définition de classe).

instanceof est un outil utile quand vous avez une collection d'objets et vous n'êtes pas sûr de ce qu'ils sont. Disons que vous avez obtenu une collection de contrôles sur un formulaire. Vous voulez lire l'état vérifié de toutes les cases à cocher, mais vous ne pouvez pas demander à un simple vieil objet son état vérifié. Au lieu de cela, vous verriez si chaque objet est une case à cocher, et si c'est le cas, jetez-le dans une case à cocher et vérifiez ses propriétés.

if (obj instanceof Checkbox)
{
    Checkbox cb = (Checkbox)obj;
    boolean state = cb.getState();
}
41
répondu Michael Petrotta 2011-09-05 23:37:15

comme décrit sur ce site :

l'opérateur instanceof peut être utilisé pour tester si un objet est type spécifique...

if (objectReference instanceof type)

un exemple rapide:

String s = "Hello World!"
return s instanceof String;
//result --> true

cependant, appliquer instanceof sur une variable/expression de référence nulle renvoie la valeur false.

String s = null;
return s instanceof String;
//result --> false

étant donné qu'une sous-classe est un "type" de sa superclasse, vous pouvez utiliser l' instanceof pour vérifier...

class Parent {
    public Parent() {}
}

class Child extends Parent {
    public Child() {
        super();
    }
}

public class Main {
    public static void main(String[] args) {
        Child child = new Child();
        System.out.println( child instanceof Parent );
    }
}
//result --> true

j'espère que cela aidera!

27
répondu fireshadow52 2018-04-04 11:08:26

si source est une variable object , instanceof est une façon de vérifier si elle est une Button ou non.

14
répondu Daniel A. White 2011-09-05 23:29:48

cet opérateur vous permet de déterminer le type d'objet. Il renvoie une valeur boolean .

par exemple

package test;

import java.util.Date;
import java.util.Map;
import java.util.HashMap;

public class instanceoftest
{
    public static void main(String args[])
    {
        Map m=new HashMap();
        System.out.println("Returns a boolean value "+(m instanceof Map));
        System.out.println("Returns a boolean value "+(m instanceof HashMap));
        System.out.println("Returns a boolean value "+(m instanceof Object));
        System.out.println("Returns a boolean value "+(m instanceof Date));
    }
} 

la sortie est:

Returns a boolean value true
Returns a boolean value true
Returns a boolean value true
Returns a boolean value false
14
répondu Purendra Agrawal 2016-08-03 13:41:08

comme mentionné dans d'autres réponses, l'usage canonique typique de instanceof est pour vérifier si un identificateur se réfère à un type plus spécifique. Exemple:

Object someobject = ... some code which gets something that might be a button ...
if (someobject instanceof Button) {
    // then if someobject is in fact a button this block gets executed
} else {
    // otherwise execute this block
}

noter 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, les suivants ne pourront pas compiler:

public class Test {
    public static void main(String [] args) {
        System.out.println(new Test() instanceof String); // will fail to compile
    }
}

cela ne colle pas avec le message:

Test.java:6: error: inconvertible types
        System.out.println(t instanceof String);
                       ^
  required: String
  found:    Test
1 error

Comme Test n'est pas un parent de la classe de String . OTOH, cela se compile parfaitement et imprime false comme prévu:

public class Test {
    public static void main(String [] args) {
        Object t = new Test();
        // compiles fine since Object is a parent class to String
        System.out.println(t instanceof String); 
    }
}
3
répondu Adam Parkin 2013-12-13 21:29:44

cet opérateur n'est utilisé que pour les variables de référence d'objet. L'opérateur vérifie si l'objet est d'un type particulier (type de classe ou de type d'interface). instanceof opérateur est écrit comme:

( Object reference variable ) instanceof  (class/interface type)

si l'objet désigné par la variable du côté gauche de l'opérateur passe la vérification" IS-a " pour le type de classe/interface du côté droit, alors le résultat sera vrai.

2
répondu Khaula Fathima 2017-03-05 21:08:42
public class Animal{ float age; }

public class Lion extends Animal { int claws;}

public class Jungle {
    public static void main(String args[]) {

        Animal animal = new Animal(); 
        Animal animal2 = new Lion(); 
        Lion lion = new Lion(); 
        Animal animal3 = new Animal(); 
        Lion lion2 = new Animal();   //won't compile (can't reference super class object with sub class reference variable) 

        if(animal instanceof Lion)  //false

        if(animal2 instanceof Lion)  //true

        if(lion insanceof Lion) //true

        if(animal3 instanceof Animal) //true 

    }
}
1
répondu bangbang 2015-09-07 14:37:32

peut être utilisé comme un raccourci dans le contrôle de l'égalité.

donc ce code

if(ob != null && this.getClass() == ob.getClass) {
}

peut s'écrire comme

if(ob instanceOf ClassA) {
}
1
répondu mirmdasif 2016-09-06 07:23:02

l'instanceof operator compare un objet à un type spécifié. Vous pouvez l'utiliser pour tester si un objet est une instance d'une classe, une instance d'une sous-classe ou d'une instance d'une classe qui implémente une interface particulière.

http://download.oracle.com/javase/tutorial/java/nutsandbolts/op2.html

0
répondu Benjamin Udink ten Cate 2011-09-05 23:44:09

Instance de mot-clé est utile lorsque vous voulez connaître l'instance d'un objet particulier .

supposez que vous êtes exception jeter et quand vous avez attraper alors effectuer la somme opération personnalisée et puis de nouveau continuer comme selon votre logique (lancers ou log etc)

exemple : 1) l'exception personnalisée créée par L'utilisateur "InvalidExtensionsException" et la jeter selon la logique

2) maintenant dans le bloc de capture captures (Exception e)) { exécuter la logique de somme si le type d'exception est "InvalidExtensionsException "

InvalidExtensionsException InvalidException =(InvalidExtensionsException)e;

3) Si vous ne Vérifiez pas l'instance de et que le type d'exception est Null pointeur exception votre code se casse.

donc votre logique devrait être à l'intérieur de l'instance de si (e instanceof InvalidExtensionsException){ InvalidExtensionsException InvalidException =(InvalidExtensionsException) e; }

l'exemple ci-dessus est une mauvaise pratique de codage mais cet exemple est vous aider à comprendre l'utilisation de l'instance.

0
répondu vaquar khan 2016-07-27 15:34:37

la plupart des gens ont correctement expliqué le" Quoi "de cette question, mais personne n'a expliqué le" Comment " correctement.

voici donc une illustration simple:

String s = new String("Hello");
if (s instanceof String) System.out.println("s is instance of String"); // True
if (s instanceof Object) System.out.println("s is instance of Object"); // True
//if (s instanceof StringBuffer) System.out.println("s is instance of StringBuffer"); // Compile error
Object o = (Object)s;
if (o instanceof StringBuffer) System.out.println("o is instance of StringBuffer"); //No error, returns False
else System.out.println("Not an instance of StringBuffer"); // 
if (o instanceof String) System.out.println("o is instance of String"); //True

sorties:

s is instance of String
s is instance of Object
Not an instance of StringBuffer
o is instance of String

la raison de l'erreur du compilateur en comparant s avec StringBuffer est bien expliquée dans docs :

Vous pouvez l'utiliser pour tester si un objet est une instance d'une classe, une instance d'une sous-classe ou d'une instance d'une classe qui implémente une interface particulière.

, 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 use instanceof then?

Puisque chaque classe étend L'objet, le type-casting LHS à l'objet fonctionnera toujours en votre faveur:

String s = new String("Hello");
if ((Object)s instanceof StringBuffer) System.out.println("Instance of StringBuffer"); //No compiler error now :)
else System.out.println("Not an instance of StringBuffer");

sorties:

Not an instance of StringBuffer
0
répondu sziraqui 2018-07-22 13:53:53

vous pouvez utiliser la carte pour faire une abstraction plus élevée sur l'instance de

private final Map<Class, Consumer<String>> actions = new HashMap<>();

alors ayant une telle carte ajouter une certaine action à elle:

actions.put(String.class, new Consumer<String>() {
        @Override
        public void accept(String s) {
           System.out.println("action for String");       
        }
    };

ayant alors un objet de type inconnu, vous pourriez obtenir une action spécifique à partir de cette carte:

actions.get(someObject).accept(someObject)
-1
répondu tomekl007 2016-05-06 14:03:08
class Test48{
public static void main (String args[]){
Object Obj=new Hello();
//Hello obj=new Hello;
System.out.println(Obj instanceof String);
System.out.println(Obj instanceof Hello);
System.out.println(Obj instanceof Object);
Hello h=null;
System.out.println(h instanceof Hello);
System.out.println(h instanceof Object);
}
}  
-1
répondu sajid sadiq 2018-07-09 06:15:28

exemple de code très simple:

If (object1 instanceof Class1) {
   // do something
} else if (object1 instanceof Class2) {
   // do something different
}

faites attention. Dans l'exemple ci-dessus, si Class1 est Objet de la première comparaison sera toujours vrai. Donc, comme avec des exceptions, l'ordre hiérarchique est important!

-2
répondu mjuarez 2011-09-05 23:38:57

l'opérateur instanceof permet de vérifier si l'objet est une instance du type spécifié. (classe ou sous-classe ou interface).

l'instanceof est également connu sous le nom d'opérateur de comparaison de type parce qu'il compare l'instance avec le type. Elle renvoie vrai ou faux.

class Simple1 {  
public static void main(String args[]) {  
Simple1 s=new Simple1();  
System.out.println(s instanceof Simple1); //true  
}  
}  

si nous appliquons l'instanceof operator avec une variable qui a une valeur nulle, elle renvoie false.

-2
répondu Viraj Pai 2017-02-10 14:40:13