2015-04-25 15 views
6

जावा < 8 में, लौटने "असुरक्षित" वस्तुओं (वस्तुओं या नल), मैं उपवर्ग में वापसी प्रकार के विशेषज्ञ करने में सक्षम था:वैकल्पिक <> और वापसी प्रकार संकुचन

class A {} 
class B extends A {} 
interface Sup { A a(); /* returns A instance, or null */ } 
interface Sub extends Sup { B a(); } 

जावा 8 में, यदि मैं चाहता हूँ मेरी एपीआई बनाने के लिए "सुरक्षित", मैं Optional<A> बजाय लौटना चाहिए "कच्चे" A:

interface Sup { Optional<A> a(); } 
interface Sub extends Sup { Optional<B> a(); } 

लेकिन संकलन नहीं है! क्योंकि Optional<B>Optional<A> का उप-वर्ग नहीं है।

मुझे इस समस्या को हल करने के लिए कैसे माना जाता है? अपने माता पिता के सीमा वाइल्डकार्ड का उपयोग करने के लिए

उत्तर

3

आप वाइल्डकार्ड का उपयोग कर सकते हैं।

interface Sup { Optional<? extends A> a(); } 

interface Sub extends Sup { Optional<? extends B> a(); } 

मैं कर सकता था यह सिर्फ Optional<B> लेकिन Optional<? extends B> का उपयोग कर एक और इंटरफ़ेस Sub का विस्तार करने और एक ही बात करने के लिए अनुमति देता है।

व्यक्तिगत रूप से, मुझे लगता है कि यह एक गड़बड़ है, और यह आवश्यक है कि A या B, या null जहां आवश्यक हो, वापस लौटना बेहतर होगा।

+0

[विचारों के स्कूल] (http://stackoverflow.com/q/9561295/1079354) जो मानते हैं कि 'वैकल्पिक' प्रतिमान में स्थानांतरित करने से कम एनपीई पैदा होते हैं, और कोड को व्यवहार करने के बारे में बेहतर कारण बताते हैं वास्तव में है। – Makoto

+0

@ मकोटो मुझे तर्क पता है, और मैं उनके साथ सहमत हूं (मैं हर समय 'वैकल्पिक' का उपयोग करता हूं)। अंत में मेरी टिप्पणी '?' और 'वैकल्पिक' –

+0

के संयोजन के बारे में थी, ऊपरी बाउंड का उपयोग करना सबसे बुरी चीज नहीं हो सकती है; बहुत ही उचित कारण हो सकते हैं कि कोई ऐसा क्यों करेगा। जिस कारण से मैंने प्रतिक्रिया व्यक्त की थी, क्योंकि आपने 'शून्य 'का उल्लेख किया था। – Makoto

2

बदलें:

Optional<? extends A> // parent 
Optional<? extends B> // child 

कारण यह है कि अपने कोड अब काम नहीं करता है तथ्य यह है कि जेनरिक अपरिवर्तनीय हैं के कारण है। B एक A है, लेकिन Optional<B>Optional<A> नहीं है।

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