मान लीजिए कि आपके पास दो इंटरफेस हैं:
interface Readable {
public void read();
}
interface Writable {
public void write();
}
कुछ मामलों में लागू करने वाली वस्तुएँ केवल इनमें से किसी एक का समर्थन कर सकती हैं, लेकिन बहुत सारे मामलों में कार्यान्वयन दोनों इंटरफेस का समर्थन करेंगे। इंटरफेस का उपयोग करने वाले लोगों को कुछ ऐसा करना होगा:
// can't write to it without explicit casting
Readable myObject = new MyObject();
// can't read from it without explicit casting
Writable myObject = new MyObject();
// tight coupling to actual implementation
MyObject myObject = new MyObject();
इन विकल्पों में से कोई भी बहुत सुविधाजनक नहीं है, और भी अधिक जब विचार करें कि आप इसे विधि पैरामीटर के रूप में चाहते हैं।
एक समाधान एक रैपिंग इंटरफ़ेस घोषित करना होगा:
interface TheWholeShabam extends Readable, Writable {}
सभी कार्यान्वयन का समर्थन करने वाले दोनों पठनीय और लिखने योग्य: लेकिन यह एक विशिष्ट समस्या है है TheWholeShabam लागू करने के लिए अगर वे इंटरफ़ेस का उपयोग कर लोगों के साथ संगत होना चाहता हूँ। भले ही यह दोनों इंटरफेस की गारंटीकृत उपस्थिति के अलावा कुछ नहीं प्रदान करता है।
क्या इस समस्या का कोई साफ समाधान है या मुझे रैपर इंटरफ़ेस के लिए जाना चाहिए?
अपडेट करें
यह वास्तव में अक्सर एक ऐसी वस्तु का होना आवश्यक होता है जो पठनीय और लिखने योग्य दोनों हो, इसलिए केवल तर्कों में चिंताओं को अलग करना हमेशा एक साफ समाधान नहीं होता है।
UPDATE2
(उत्तर के रूप में निकाला गया तो इस पर टिप्पणी करना आसान है)
Update3
कृपया सावधान रहें कि इसके लिए प्राथमिक usecase स्ट्रीम नहीं है (हालाँकि उन्हें भी समर्थित होना चाहिए)। धाराएँ इनपुट और आउटपुट के बीच बहुत विशिष्ट अंतर बनाती हैं और जिम्मेदारियों का स्पष्ट पृथक्करण होता है। इसके बजाय, एक बाइटबफ़र जैसी चीज़ के बारे में सोचें, जहाँ आपको एक ऐसी वस्तु की आवश्यकता हो जिसे आप लिख सकते हैं और उससे पढ़ सकते हैं, एक ऐसी वस्तु जिसके पास एक बहुत ही विशिष्ट स्थिति है। ये वस्तुएं मौजूद हैं क्योंकि वे एसिंक्रोनस I / O जैसी कुछ चीजों के लिए बहुत उपयोगी हैं, एन्कोडिंग, ...
UPDATE4
मेरी कोशिश की गई पहली चीजों में से एक नीचे दिए गए सुझाव के समान थी (स्वीकार किए गए उत्तर की जांच करें) लेकिन यह बहुत नाजुक साबित हुई।
मान लीजिए कि आपके पास एक वर्ग है जिसे टाइप वापस करना है:
public <RW extends Readable & Writable> RW getItAll();
यदि आप इस विधि को कॉल करते हैं, तो जेनेरिक आरडब्ल्यू को ऑब्जेक्ट प्राप्त करने वाले चर द्वारा निर्धारित किया जाता है, इसलिए आपको इस संस्करण का वर्णन करने के लिए एक तरीका चाहिए।
MyObject myObject = someInstance.getItAll();
यह काम करेगा लेकिन एक बार फिर इसे लागू करने के लिए बाध्य करता है और वास्तव में रनटाइम पर क्लासकैस्टेसेप्शन फेंक सकता है (जो लौटा है उसके आधार पर)।
इसके अतिरिक्त यदि आप RW प्रकार का एक वर्ग चर चाहते हैं, तो आपको कक्षा स्तर पर जेनेरिक को परिभाषित करने की आवश्यकता है।