2010-10-09 13 views
6

निम्न कोड में, x के प्रकार मैं है (हालांकि एक्स भी जम्मू को लागू करता है लेकिन संकलन समय पर नहीं जाना जाता है thats) तो क्यों है कि कम से कोड (1) एक संकलन समय त्रुटि हो नहीं है कि यह है। क्योंकि संकलन समय पर केवल संदर्भ का प्रकार माना जाता है।यह उदाहरण कोड का उदाहरण क्यों करता है और संकलन समय त्रुटि का कारण नहीं बनता है?

public class MyClass { 
    public static void main(String[] args) { 
     I x = new D(); 
     if (x instanceof J) //(1) 
      System.out.println("J"); 
    } 
} 

interface I {} 

interface J {} 

class C implements I {} 

class D extends C implements J {} 
+1

साइड नोट - भाषा के लिए कोई टैग जोड़ने की भूल नहीं है कृपया। मैंने आपके लिए "जावा" जोड़ा। – EboMike

+0

खेद मैं – user439526

उत्तर

12

instanceof किसी ऑब्जेक्ट के प्रकार के रनटाइम निर्धारण के लिए उपयोग किया जाता है। आप यह निर्धारित करने की कोशिश कर रहे हैं कि x वास्तव में प्रोग्राम चल रहा है, तो J प्रकार का एक ऑब्जेक्ट है, इसलिए यह संकलित करता है।

आप सोच यह एक संकलन समय त्रुटि हो जाना चाहिए, क्योंकि आपको लगता है संकलक x के प्रकार पता नहीं है रहे थे?

संपादित

किर्क Woll टिप्पणी की है के रूप में (धन्यवाद किर्क Woll!), तुम अगर x देख रहे हों, तो एक instanceof एक ठोस वर्ग है, और संकलक x के प्रकार का निर्धारण कर सकते हैं, तो आप मिल जाएगा संकलन समय पर एक त्रुटि।

जावा भाषा विशिष्टता से:

ReferenceType को RelationalExpression की एक डाली एक संकलन समय त्रुटि के रूप में अस्वीकृत कर दिया जाएगा, तो instanceof रिलेशनल अभिव्यक्ति वैसे ही एक संकलन समय त्रुटि पैदा करता है। ऐसी स्थिति में, अभिव्यक्ति के उदाहरण का परिणाम कभी भी सच नहीं हो सकता है।

इस का एक उदाहरण के रूप में:

import java.io.Serializable; 
import java.io.IOException; 
import java.io.ObjectOutputStream; 
import java.io.ObjectInputStream; 

class SerializableClass implements Serializable 
{ 
    private writeObject(ObjectOutputStream out) {} 
    private readObject(ObjectInputStream in) {} 
} 

public class DerivedSerializableClass extends SerializableClass 
{ 
    public static void main(String[] args) 
    { 
     DerivedSerializableClass dsc = new DerivedSerializableClass(); 

     if (dsc instanceof DerivedSerializableClass) {} // fine 
     if (dsc instanceof Serializable) {} // fine because check is done at runtime 
     if (dsc instanceof String) {} // error because compiler knows dsc has no derivation from String in the hierarchy 

     Object o = (Object)dsc; 
     if (o instanceof DerivedSerializableClass) {} // fine because you made it Object, so runtime determination is necessary 
    } 
} 
+1

+1 होना चाहिए, और अगर यह * नहीं * एक क्रम ऑपरेटर, क्या पृथ्वी पर इसका महत्व समझ में होगा रहे थे? इसका उपयोग करने वाले 'if' कथन का कोई मतलब नहीं होगा। खैर मैं क्या पढ़ा एक प्रारंभिक संकलन समय की जांच होती है जब instanceof ऑपरेटर जो निर्धारित करता है कि स्रोत और गंतव्य एक उप-प्रकार-महाप्रकार रिश्ता है का उपयोग करने से –

+0

। फिर स्रोत का वास्तविक उद्देश्य यह निर्धारित करने के लिए प्रयोग किया जाता है कि स्रोत गंतव्य प्रकार का उप प्रकार है या नहीं। – user439526

+1

कृपया मेरी समझ को सही करें कि यह कैसे काम करना चाहिए। तो इस कोड में हालांकि एक्स द्वारा प्रस्तुत ऑब्जेक्ट जे का उप-प्रकार है लेकिन आई और जे के बीच कोई संबंध नहीं है, इसलिए चूंकि एक्स उपरोक्त कोड में टाइप I है I यानी x = new d() ;, इस खेल को चाहिए संकलन समय पर एक भूमिका? – user439526

2

instanceof एक रन-टाइम ऑपरेटर, नहीं संकलन समय है, इसलिए इसे का उपयोग कर वस्तु के वास्तविक प्रकार संदर्भित किया जा रहा मूल्यांकन किया जा रहा है।

+0

लेकिन यह संकलन त्रुटियों का उत्पादन कर सकता है। .. – EJP

+0

हाँ, अगर यह स्थिर इनपुट (यानी संदर्भों के बजाय कक्षाएं) हो जाता है। मुझे अपना जवाब संपादित करना चाहिए, हालांकि कुरोपेंगिन ने पहले ही एक बहुत ही संपूर्ण उत्तर दिया है, इसलिए यह मंथन है। – EboMike

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^