जावा में 'इंस्टोफ' ऑपरेटर का उपयोग किस लिए किया जाता है?


163

instanceofऑपरेटर किसके लिए उपयोग किया जाता है? मैंने जैसे सामान देखा है

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

लेकिन इससे किसी को भी कोई मतलब नहीं था। मैंने अपना शोध किया है, लेकिन बिना किसी स्पष्टीकरण के केवल उदाहरणों के साथ आया।


38
यहां प्रश्न पूछने में कुछ भी गलत नहीं है, लेकिन यदि आप जावा सीख रहे हैं तो आप एक पुस्तक प्राप्त करना चाहते हैं। किसी भी सभ्य जावा पुस्तक के पास इस सवाल का जवाब होगा और अगले 1000 आपके पास होने वाले हैं।
राष्ट्रपति जेम्स के। पोल

ऐसे ऑपरेटर के कई विशिष्ट उपयोग हैं। यह एक विशिष्ट प्रश्न होगा यदि यह उन उदाहरणों में से एक का स्पष्टीकरण मांगता है जो आपके लिए समझ में नहीं आए।
राडवल्ड

2
नीचे दिए गए उत्तर सही हैं, हालांकि ध्यान दें कि उदाहरण के लिए, 10 में से 9 बार एक overused संचालक है, इसे बहुरूपता के एक उचित उपयोग द्वारा प्रतिस्थापित किया जा सकता है (हमेशा नहीं, लेकिन अक्सर)
रिचर्ड टिंगल

मैं रिचर्ड की तुलना में एक और आगे जाऊँगा: मैंने कभी भी उदाहरण के वैध उपयोग को नहीं देखा है। यह खराब डिजाइन कोड के शीर्ष पर त्वरित हैक के लिए केवल उपयोगी है। यदि आपको OOP पसंद नहीं है, तो किसी अन्य भाषा में लिखें (बहुत सारे हैं)। उदाहरण के लिए, "नहीं" कहें!
स्कॉट बिग्स

5
@ScottBiggs instanceofओवरराइड करते समय एक अच्छा विकल्प है equals?
बेन आरोनसन

जवाबों:


228

instanceofकीवर्ड एक द्विआधारी ऑपरेटर है जिसका उपयोग परीक्षण करने के लिए किया जाता है यदि कोई वस्तु (उदाहरण) किसी दिए गए प्रकार का उपप्रकार है।

कल्पना कीजिए:

interface Domestic {}
class Animal {}
class Dog extends Animal implements Domestic {}
class Cat extends Animal implements Domestic {}

एक dog वस्तु की कल्पना करें , जिसके साथ बनाया गया है Object dog = new Dog():

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

हालाँकि, के साथ Object animal = new Animal();,

animal instanceof Dog // false

क्योंकि Animalएक सुपरस्क्रिप्ट है Dogऔर संभवतः कम "परिष्कृत"।

तथा,

dog instanceof Cat // does not even compile!

इसका कारण यह है कि Dogन तो कोई उपप्रकार है और न ही इसका कोई उपप्रकार Cat, और यह भी इसे लागू नहीं करता है।

ध्यान दें कि dogऊपर प्रयोग किया गया चर प्रकार का है Object। यह दिखाना है instanceofकि एक रनटाइम ऑपरेशन है और हमें एक / उपयोग केस में लाता है: रनटाइम पर ऑब्जेक्ट प्रकार पर आधारित अलग-अलग प्रतिक्रिया करने के लिए

ध्यान देने योग्य बातें: expressionThatIsNull instanceof Tसभी प्रकार के लिए गलत है T

खुश कोडिंग।


14
मैंने बस कोशिश की - Object dog = new Dog(); System.out.println(dog instanceof Cat);। यह बस ठीक और प्रिंट संकलित करता है false। संकलक को संकलित समय पर यह निर्धारित करने की अनुमति नहीं है कि dogएक बिल्ली (जेएलएस में नियमों के अनुसार) नहीं हो सकती है
इरविन बोल्विड्ट

@ErwinBolwidt जब आपने ऐसा प्रयास किया तो आपसे एक गलती हो गई। सोच रहे किसी के लिए: जेएलएस धारा 15.20.2 वह है जिसकी आप तलाश कर रहे हैं। एक न्यूनतम गैर-वाणिज्यिक उदाहरण के लिए:boolean b = "foo" instanceof Integer;
फेलिक्स एस

3
@ फ़ेलिक्स आपको उत्तर को फिर से पढ़ने की आवश्यकता है। उत्तर के बारे में है Object indirect = ...; if (indirect instanceof Something)। ऐसा नहीं है if (literal instanceof Something)कि आप ऐसा मान रहे हैं।
इरविन बोलविएट

1
@ErwinBolwidt ओह, ठीक है, मैं Object dogभाग पर छोड़ दिया जाना चाहिए । मेरी गलती!
फेलिक्स एस

dog instanceof Cat // does not even compile!(क्योंकि यह एक वर्ग है)। अगर Catएक इंटरफेस होता तो यह संकलन करता।
हमजा बेलमेलॉकी

44

यह एक ऑपरेटर है जो सही रिटर्न देता है अगर अभिव्यक्ति के बाईं ओर दाईं ओर वर्ग नाम का एक उदाहरण है

इस तरह से इसके बारे में सोचो। कहते हैं कि आपके ब्लॉक के सभी घर एक ही ब्लूप्रिंट से बने थे। दस घर (वस्तुएं), ब्लूप्रिंट का एक सेट (वर्ग परिभाषा)।

instanceofएक उपयोगी उपकरण है जब आपको वस्तुओं का संग्रह मिला है और आपको यकीन नहीं है कि वे क्या हैं। मान लीजिए कि आपको किसी फ़ॉर्म पर नियंत्रणों का संग्रह मिल गया है। आप जो भी चेकबॉक्स हैं, उसकी जाँच की गई स्थिति को पढ़ना चाहते हैं, लेकिन आप इसकी जाँच की गई अवस्था के लिए एक पुरानी पुरानी वस्तु नहीं पूछ सकते। इसके बजाय, आप देखेंगे कि प्रत्येक ऑब्जेक्ट एक चेकबॉक्स है, और यदि यह है, तो इसे चेकबॉक्स में डालें और इसके गुणों की जांच करें।

if (obj instanceof Checkbox)
{
    Checkbox cb = (Checkbox)obj;
    boolean state = cb.getState();
}

15
यह कहना है, का उपयोग instanceofकर इसे डाउनकास्ट करने के लिए सुरक्षित कर सकते हैं।
Raedwald

29

इस साइट पर वर्णित के रूप में :

instanceofऑपरेटर परीक्षण करने के लिए इस्तेमाल किया जा सकता है, तो एक वस्तु एक विशेष प्रकार का है ...

if (objectReference instanceof type)

एक त्वरित उदाहरण:

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

हालाँकि, instanceofएक शून्य संदर्भ चर / अभिव्यक्ति पर लागू करने से गलत रिटर्न मिलता है।

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

चूंकि एक उपवर्ग अपने सुपरक्लास का एक 'प्रकार' है, आप इसे instanceofसत्यापित करने के लिए उपयोग कर सकते हैं ...

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

आशा है कि ये आपकी मदद करेगा!


15

यह ऑपरेटर आपको ऑब्जेक्ट के प्रकार को निर्धारित करने की अनुमति देता है। यह एक booleanमूल्य देता है ।

उदाहरण के लिए

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));
    }
} 

आउटपुट है:

Returns a boolean value true
Returns a boolean value true
Returns a boolean value true
Returns a boolean value false


5

जैसा कि अन्य उत्तरों में उल्लेख किया गया है, विहित विशिष्ट उपयोग की instanceofजाँच के लिए है यदि कोई पहचानकर्ता अधिक विशिष्ट प्रकार का उल्लेख कर रहा है। उदाहरण:

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
}

हालाँकि, ध्यान दें कि बाएं हाथ की अभिव्यक्ति का प्रकार दाहिने हाथ की अभिव्यक्ति का एक मूल प्रकार होना चाहिए (देखें JLS 15.20.2 और जावा गूढ़ व्यक्ति , # 50, pp114 )। उदाहरण के लिए, निम्नलिखित संकलन करने में विफल रहेगा:

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

यह संदेश संकलित करने में विफल रहता है:

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

के रूप Testमें एक मूल वर्ग नहीं है String। OTOH, यह पूरी तरह से संकलित करता है और falseअपेक्षा के अनुसार प्रिंट करता है:

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); 
    }
}

कल्पना से जोड़ने के लिए धन्यवाद!
jpaugh

1
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

समानता जांच में शॉर्टहैंड के रूप में इस्तेमाल किया जा सकता है।

तो यह कोड

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

के रूप में लिखा जा सकता है

if(ob instanceOf ClassA) {
}

1

अधिकांश लोगों ने इस प्रश्न के "क्या" को सही ढंग से समझाया है लेकिन किसी ने "कैसे" को सही ढंग से नहीं समझाया।

तो यहाँ एक सरल चित्रण है:

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

आउटपुट:

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

sस्ट्रिंगर के साथ तुलना करते समय संकलक त्रुटि का कारण डॉक्स में अच्छी तरह से समझाया गया है :

आप इसका उपयोग यह जांचने के लिए कर सकते हैं कि कोई ऑब्जेक्ट किसी वर्ग का उदाहरण है, किसी उपवर्ग का उदाहरण है, या किसी वर्ग का एक उदाहरण जो किसी विशेष इंटरफ़ेस को लागू करता है।

जिसका अर्थ है कि LHS या तो RHS या एक वर्ग का उदाहरण होना चाहिए जो RHS को लागू करता है या RHS का विस्तार करता है।

कैसे उपयोग करने के लिए Instof तो?
चूंकि प्रत्येक कक्षा ऑब्जेक्ट का विस्तार करती है, इसलिए ऑब्जेक्ट को टाइप करने वाला एलएचएस हमेशा आपके पक्ष में काम करेगा:

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");

आउटपुट:

Not an instance of StringBuffer

अंतिम उदाहरण में, यह "स्ट्रिंगबफ़र का उदाहरण नहीं" क्यों लौटा रहा है? चूँकि आपने LHS पर ऑब्जेक्ट टाइप किया है और जाँच कर रहा है कि क्या यह एक उदाहरण RHS है if ((Object)s instanceof StringBuffer) System.out.println("Instance of StringBuffer"); //shouldn't this be true, क्योंकि हम टाइप करना चाहते हैं?
sofs1

क्योंकि स्ट्रिंग स्ट्रिंग ऑब्जेक्ट का संदर्भ है (जावा C ++ के विपरीत गतिशील बहुरूपता को नियोजित करता है) और स्ट्रिंग स्ट्रिंगरबफ़र का उपवर्ग नहीं है।
sziraqui

0

Instof ऑपरेटर किसी ऑब्जेक्ट को एक निर्दिष्ट प्रकार से तुलना करता है। आप इसका उपयोग यह जांचने के लिए कर सकते हैं कि कोई ऑब्जेक्ट किसी वर्ग का उदाहरण है, किसी उपवर्ग का उदाहरण है, या किसी वर्ग का एक उदाहरण जो किसी विशेष इंटरफ़ेस को लागू करता है।

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


0

जब आप किसी विशेष वस्तु का उदाहरण जानना चाहते हैं, तो खोजशब्द का उपयोग सहायक होता है।

मान लें कि आप अपवाद फेंक रहे हैं और जब आप पकड़ लेते हैं तब कस्टम ऑपरेशन करें और फिर अपने तर्क (फेंकता या लॉग आदि) के अनुसार जारी रखें

उदाहरण: 1) उपयोगकर्ता ने कस्टम अपवाद "InvalidExtensionsException" बनाया और तर्क के अनुसार इसे फेंक दिया

2) अब कैच ब्लॉक कैच में (अपवाद e) {अपवाद प्रकार होने पर समक तर्क निष्पादित करें "InvalidExtensionsException"

InvalidExtensionsException InvalidException =(InvalidExtensionsException)e;

3) यदि आप उदाहरण की जाँच नहीं कर रहे हैं और अपवाद प्रकार अशक्त सूचक अपवाद है तो आपका कोड टूट जाएगा।

तो आपका तर्क उदाहरण के अंदर होना चाहिए अगर (e Instof InvalidExtensionsException) {InvalidExtensionsException InvalidException = (InvalidExtensionsException) e; }

उपरोक्त उदाहरण गलत कोडिंग अभ्यास है हालांकि यह उदाहरण आपको इसके उदाहरण के उपयोग को समझने में मदद करता है।


0

सबसे अच्छा स्पष्टीकरण jls है । हमेशा यह जांचने की कोशिश करें कि स्रोत क्या कहता है। वहां आपको सबसे अच्छा जवाब मिलेगा और भी बहुत कुछ। कुछ हिस्सों को यहाँ प्रस्तुत कर रहे हैं:

Instof संचालक के RelationalExpression ऑपरेंड का प्रकार एक संदर्भ प्रकार या अशक्त प्रकार होना चाहिए; अन्यथा, एक संकलन-समय त्रुटि उत्पन्न होती है।

यह एक संकलित समय की त्रुटि है अगर उदाहरण के लिए उल्लेख किया गया है उदाहरण के बाद Instof ऑपरेटर एक संदर्भ प्रकार को अस्वीकार नहीं करता है जो कि reifiable (if4.7) है।

यदि ReferenceType से RelationalExpression की एक कास्ट (a15.16) संकलन-समय त्रुटि के रूप में अस्वीकार कर दी जाएगी, तो इसी तरह Instof संबंधपरक अभिव्यक्ति एक संकलन-समय त्रुटि पैदा करती है। ऐसी स्थिति में, सहज अभिव्यक्ति का परिणाम कभी भी सत्य नहीं हो सकता है।


0

जावा instanceofऑपरेटर का उपयोग यह जांचने के लिए किया जाता है कि ऑब्जेक्ट निर्दिष्ट प्रकार (वर्ग या उपवर्ग या इंटरफ़ेस) का एक उदाहरण है या नहीं।

Java में instof को टाइप के comparison operatorरूप में भी जाना जाता है क्योंकि यह टाइप के साथ इंस्टेंस की तुलना करता है। वह trueया तो लौटता है या false। यदि हम instanceofऑपरेटर को किसी भी वैरिएबल के साथ लागू करते हैं जिसका nullमूल्य है, तो वह वापस आ जाता है false

JDK 14+ से जिसमें JEP 305 शामिल है, हम इसके लिए "पैटर्न मिलान" भी कर सकते हैंinstanceof

पैटर्न मूल रूप से परीक्षण करते हैं कि एक मूल्य का एक निश्चित प्रकार है, और जब यह मिलान प्रकार होता है तो मूल्य से जानकारी निकाल सकता है। पैटर्न मिलान एक प्रणाली में सामान्य तर्क की अधिक स्पष्ट और कुशल अभिव्यक्ति की अनुमति देता है, अर्थात् वस्तुओं से घटकों का सशर्त निष्कासन।

जावा 14 से पहले

if (obj instanceof String) {
    String str = (String) obj; // need to declare and cast again the object
    .. str.contains(..) ..
}else{
     str = ....
}

जावा 14 संवर्द्धन

if (!(obj instanceof String str)) {
    .. str.contains(..) .. // no need to declare str object again with casting
} else {
    .. str....
}

हम टाइप चेक और अन्य शर्तों को भी एक साथ जोड़ सकते हैं

if (obj instanceof String str && str.length() > 4) {.. str.contains(..) ..}

instanceofजावा प्रोग्राम में स्पष्ट मिलान की कुल संख्या को कम करने के लिए पैटर्न मिलान का उपयोग करना चाहिए।

पुनश्च : instanceOfकेवल तभी मेल खाएगा जब वस्तु अशक्त न हो, तभी उसे सौंपा जा सकता है str


-1
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
केवल StackOverflow पर कोड पोस्ट न करें। कृपया आगे बढ़ें और एक स्पष्टीकरण जोड़ें।
एल। गुटहार्ट

-2

बहुत सरल कोड उदाहरण:

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

यहां सावधान रहें। ऊपर दिए गए उदाहरण में, यदि Class1 ऑब्जेक्ट है, तो पहली तुलना हमेशा सही होगी। तो, अपवादों की तरह, पदानुक्रमित आदेश मायने रखता है!


-2

आप उदाहरण के लिए उच्च अमूर्त बनाने के लिए मानचित्र का उपयोग कर सकते हैं

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

फिर इस तरह के नक्शे में कुछ कार्रवाई जोड़ने के लिए:

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

तब ज्ञात प्रकार की एक वस्तु होने पर आप उस नक्शे से विशिष्ट कार्रवाई कर सकते हैं:

actions.get(someObject).accept(someObject)

-2

इंस्टोफ़ ऑपरेटर का उपयोग यह जांचने के लिए किया जाता है कि ऑब्जेक्ट निर्दिष्ट प्रकार का उदाहरण है या नहीं। (वर्ग या उपवर्ग या इंटरफ़ेस)।

इंस्टोफ़ को टाइप तुलना ऑपरेटर के रूप में भी जाना जाता है क्योंकि यह टाइप के साथ उदाहरण की तुलना करता है। यह या तो सही है या गलत।

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

यदि हम किसी भी वैरिएबल के साथ इंस्टोऑफ़ ऑपरेटर को लागू करते हैं, जिसका शून्य मान है, तो यह गलत है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.