मेरे पास निम्नलिखित कक्षाएं हैं:
public class Base {
public int someMethod(){...}
}
public class Derrived extends Base {
@Override
public int someMethod(){...}
}
इसके अलावा मेरे पास एक तरीका है जो मुझे लौटाता है List<Base>
List<Base> method() {
return fetch();
}
तरीका fetch()
रिटर्न List<? extends Base>
लेकिन वास्तव में यह व्युत्पन्न वर्ग के उदाहरणों की सूची रखता है
List<? extends Base> fetch() {}
लेकिन कोड जो विधि को परिभाषित करता है method()
संकलन नहीं करेगा। इसके लिए कास्टिंग की आवश्यकता है List<Base>
। अगर मुझे हमेशा उस संग्रह के उदाहरणों को बेस क्लास के उदाहरणों के रूप में माना जा सकता है, तो मुझे इसे डालने की आवश्यकता क्यों है?
उत्तर:
जवाब के लिए 5 № 1ए List<? extends Base>
isn "के रूप में एक ही बात नहीं है List<Base>
उसी तरह से जिस तरह केले का एक गुच्छा एक टीशू नहीं होता है।
विचार करें:
List<Derived> x = new ArrayList<Derived>();
// This is valid...
List<? extends Base> y = x;
// This is what you *want* to be valid
List<Base> z = y;
z.add(new Base());
// This looks fine at compile-time... but what would you expect it to do?
Derived d = x.get(0);
यह सब का इलाज करने के लिए एक बात है मौजूदा के तत्व List<Derived>
के उदाहरण के रूप में Base
- लेकिन आप "टी जोड़ना ए Base
ए के लिए List<Base
>, जबकि आप कर सकते हैं एक को जोड़ें List<Derived>
। वहाँ हर नहीं List<Derived>
है List<Base>
.
उत्तर № 2 के लिए 1
आप ऐसा नहीं कर सकते क्योंकि इस बात की कोई गारंटी नहीं है कि कोई व्यक्ति आधार के किसी भिन्न उप-वर्ग के संग्रह में सम्मिलित होने का प्रयास नहीं करेगा।
फिर क्या होगा?
यह होगा देखना ठीक है, लेकिन आप मूल रूप से एक ही संग्रह में दो अलग-अलग प्रकार की वस्तुओं का उपयोग करने की कोशिश कर रहे हैं, कुछ ऐसा, जैसा कि आप जानते हैं, अनुमति नहीं है।