2011-09-24 16 views
5

मेरा प्रश्न जावा 7. मान लीजिए में जेनरिक के बारे में है हम इस तरह के वर्ग पदानुक्रम है:जेनरिक में वाइल्डकार्ड: "? सुपर टी" काम करता है जबकि "टी फैलाता है" नहीं करता है?

interface Animal {}  
class Lion implements Animal {}  
class Butterfly implements Animal {} 

वैसे ही जैसे Java Generics Tutorial

इसके अलावा में हम एक वर्ग

class Cage<T> { 
    private List<T> arr = new ArrayList<>(); 
    public void add(T t) { 
     arr.add(t); 
    } 
    public T get() { 
     return arr.get(0); 
    } 
} 

है और यहाँ कोड है जो कक्षाओं का उपयोग करता है:

public static void main(String[] args) { 
     Cage<? extends Animal> cage = new Cage<>(); 
     Animal a = cage.get(); //OK 
     cage.add(new Lion()); //Compile-time error 
     cage.add(new Butterfly()); //Compile-time error 
    } 

प्रश्न # 1:

मैंने इन मुद्दों के बारे में here पढ़ा है लेकिन Cage<?> की तरह ही था। लेकिन मैं संकलक <? extends Animal> बताता हूं इसलिए Cage<T> में टाइप करें पशु प्रकार के उपप्रकारों में से कोई भी होगा। तो यह अभी भी एक संकलन समय त्रुटि क्यों देता है?

प्रश्न # 2:

अगर मैं सब कुछ ठीक काम करता है और संकलक कुछ भी बुरा नहीं कहती Cage<? super Animal> cage = ...Cage<? extends Animal> cage = ... के बजाय निर्दिष्ट करें। इस मामले में यह ठीक काम करता है जबकि ऊपर दिए गए उदाहरण में यह विफल रहता है?

उत्तर

6

पिंजरे दोनों जानवरों के प्रकार को पकड़ने में सक्षम होना चाहिए। "सुपर" कहता है कि - यह कहता है कि पिंजरे सभी जानवरों के प्रकार - और शायद कुछ अन्य चीजें भी पकड़ने में सक्षम होना चाहिए, क्योंकि ? super Animal पशु का एक सुपरक्लास हो सकता है। "फैली" का कहना है कि यह कुछ पशुओं के प्रकार धारण कर सकते हैं - हो सकता है सिर्फ लायंस, उदाहरण के लिए, के रूप में:

Cage<? extends Animal> cage = new Cage<Lion>(); 

, जिसमें एक मान्य बयान हो सकता है, लेकिन स्पष्ट रूप से शेर पिंजरे तितलियों पकड़ नहीं होगा, इसलिए

cage.add(new Butterfly()); 

संकलित नहीं होगा। Cage<? extends Animal> - - नहीं उद्देश्य यह है कि यह करने के लिए अभी (Cage<Lion>) निर्दिष्ट किया जाता है क्योंकि यहाँ जावा पिंजरे की घोषणा में दिख रही है बयान

cage.add(new Lion()); 

, या तो संकलन नहीं होगा।

जेनिक्स का सबसे अच्छा विवरण मुझे पता है O'Reilly's Java in a Nutshell में है। अध्याय मुफ्त ऑनलाइन है - part 1 और part 2

+0

और cage.add (नया शेर()) संकलित नहीं होगा। – maks

+0

फिक्स्ड - धन्यवाद। –

+1

जावा ट्यूटोरियल "सुपर" के मुताबिक यह कहता है कि यह जानवरों के लिए सुपरटेप्स के सभी प्रकारों को पकड़ सकता है: "कोड , इसलिए," अज्ञात प्रकार के रूप में पढ़ा जाएगा जो पशु का एक सुपरटेप है, संभवतः पशु अपने आप""। लेकिन न तो शेर और न ही तितली जानवरों के लिए सुपर प्रकार हैं, यह क्यों काम करता है? – maks

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