मेरा प्रश्न जावा 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 = ...
के बजाय निर्दिष्ट करें। इस मामले में यह ठीक काम करता है जबकि ऊपर दिए गए उदाहरण में यह विफल रहता है?
और cage.add (नया शेर()) संकलित नहीं होगा। – maks
फिक्स्ड - धन्यवाद। –
जावा ट्यूटोरियल "सुपर" के मुताबिक यह कहता है कि यह जानवरों के लिए सुपरटेप्स के सभी प्रकारों को पकड़ सकता है: "कोड सुपर एनिमल>, इसलिए," अज्ञात प्रकार के रूप में पढ़ा जाएगा जो पशु का एक सुपरटेप है, संभवतः पशु अपने आप""। लेकिन न तो शेर और न ही तितली जानवरों के लिए सुपर प्रकार हैं, यह क्यों काम करता है? – maks