/ / रिटर्न स्टेटमेंट में जेनरिक में कास्टिंग का उपयोग करना - जावा, जेनरिक, कास्टिंग

रिटर्न स्टेटमेंट में जेनेरिक में कास्टिंग का उपयोग - जावा, जेनेरिक, कास्टिंग

मेरे पास निम्नलिखित कक्षाएं हैं:

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

आप ऐसा नहीं कर सकते क्योंकि इस बात की कोई गारंटी नहीं है कि कोई व्यक्ति आधार के किसी भिन्न उप-वर्ग के संग्रह में सम्मिलित होने का प्रयास नहीं करेगा।

फिर क्या होगा?

यह होगा देखना ठीक है, लेकिन आप मूल रूप से एक ही संग्रह में दो अलग-अलग प्रकार की वस्तुओं का उपयोग करने की कोशिश कर रहे हैं, कुछ ऐसा, जैसा कि आप जानते हैं, अनुमति नहीं है।