2016-04-10 6 views
10

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

उदाहरण के लिए: लाइन 10 में मुझे संकलन त्रुटि मिल रही है क्योंकि पशु स्ट्रिंग का उप-वर्ग नहीं है। लेकिन लाइन 14 में मुझे संकलन त्रुटि नहीं मिल रही है, भले ही पशु सूची इंटरफेस को लागू नहीं करता है।

class Animal { 

} 

public class InstanceOf { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     Animal a = new Animal(); 
     if (a instanceof String){ //line 10 
      System.out.println("True"); 
     } 

     if (a instanceof List){ //line 14 
      System.out.println("True"); 
     } 
    } 

} 
+0

कृपया प्रश्न में सही त्रुटि संदेश शामिल करें। –

+0

इस पर विचार करें: 'कक्षा बी पशु उपकरण सूची' बढ़ाता है। अब यह: 'पशु ए = नया बी(); ' – njzk2

+0

@ टुनकी आपके पास" डुप्फेमर® "भी है - आपने इसे क्यों बंद नहीं किया? (संभावना: आप मेरे जैसे संकोच कर रहे हैं ...: - /) – Marco13

उत्तर

18

a कभी नहीं एक instanceof स्ट्रिंग, इसलिए संकलन त्रुटि हो सकता है।

aList का एक उदाहरण है, तो Animal के कुछ उप-वर्ग List इंटरफ़ेस को लागू होता है और आप a लिए इस तरह के उप-वर्ग का एक उदाहरण आवंटित होगा हो सकता है। इसलिए संकलक इसे अनुमति देता है।

JLS से:

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

+1

क्या जावा को एकाधिक विरासत की अनुमति नहीं है मूल कारण है? साथ ही जब भी कोई चाहें तो कोई उप-वर्ग इंटरफ़ेस को कार्यान्वित कर सकता है? – nantitv

+3

@nantitv हां। चूंकि पशु स्ट्रिंग का उप-वर्ग नहीं है, इसलिए पशु का कोई उप-वर्ग स्ट्रिंग का उप-वर्ग नहीं हो सकता है। यद्यपि आपके विशिष्ट स्निपेट में, यह एकाधिक अंतर की अनुमति होने पर भी कोई फर्क नहीं पड़ता है, क्योंकि स्ट्रिंग अंतिम है और इसे उप-वर्गीकृत नहीं किया जा सकता है। – Eran

+0

धन्यवाद। स्ट्रिंग मैंने अभी इसे एक उदाहरण के लिए लिया है। – nantitv

1

इस प्रश्न से मैंने केवल एक प्रयोग किया था।

class Animal {} 
interface AnimalA {} 
class AnimalB{} 

class AnimalC extends Animal,AnimalB {} //not possible 
class AnimalD extends Animal implements AnimalA{} //possible 

public class InstanceOfTest { 

    public static void main(String[] args) { 
     Animal a = new Animal(); 
     if(a instanceof AnimalA) { //no compile time error 
      System.out.println("interface test"); 
     } 
     if(a instanceof AnimalB) { //compile time error 
      System.out.println("interface test"); 
     } 
     if(a instanceof List) { //compile time error 
      System.out.println("interface test"); 
     } 
     if(a instanceof ArrayList) { //compile time error 
      System.out.println("interface test"); 
     } 
    } 
} 

तो जैसा कि @Eran कहा, Animal के रूप में अपनी उप-वर्ग बन सकता है और AnimalB के कहने के AnimalB गैर की एक उप-वर्ग नहीं है। लेकिन दूसरी तरफ इसके उप-वर्ग interface सूची को कार्यान्वित कर सकते हैं।

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