2010-04-21 11 views
12

मैं कुछ कोड जावा 5 में अपग्रेड कर रहा हूं और जेनिक्स के साथ कुछ समझ नहीं रहा हूं। मेरे पास अन्य वर्ग हैं जो एक बार तुलनात्मक रूप से लागू होते हैं, जिन्हें मैं कार्यान्वित करने में सक्षम हूं। लेकिन अब मुझे एक कक्षा मिली है, विरासत के कारण, 2 प्रकार के लिए तुलनात्मक लागू करने की कोशिश कर रहा है। यहाँ मेरी स्थिति है:मैं तुलनात्मक रूप से एक से अधिक बार कैसे कार्यान्वित कर सकता हूं?

मैंने मिला निम्नलिखित वर्गों/इंटरफेस:

interface Foo extends Comparable<Foo> 

interface Bar extends Comparable<Bar> 

abstract class BarDescription implements Bar 

class FooBar extends BarDescription implements Foo 
इस के साथ

, मैं त्रुटि मिलती है 'इंटरफ़ेस तुलनीय अलग तर्क के साथ एक से अधिक बार लागू नहीं किया जा सकता है ...'

मेरे पास FooBar में लागू की गई तुलना (Foo foo) क्यों नहीं हो सकती है, और बारडिस्क्रिप्शन में लागू की गई तुलना (बार) की तुलना भी नहीं की जा सकती? क्या यह बस विधि अधिभार नहीं है?

संपादित करें: मेरे पास कई कक्षाएं हैं जो बारडिस्क्रिप्शन का विस्तार करती हैं। यदि मैं बार पर तुलनात्मक के लिए प्रकार पैरामीटर को हटा देता हूं, इसे कच्चे राज्य में छोड़ देता हूं, तो मुझे बारडिस्क्रिप्शन को बढ़ाने वाले सभी वर्गों को सॉर्ट करते समय कंपाइलर चेतावनियों का एक गुच्छा मिलता है। क्या इसे नीचे वाइल्डकार्ड के जवाब के साथ हल किया जाएगा? यह जवाब रखरखाव के लिए समझने में काफी जटिल और मुश्किल लग रहा है।

+0

वही प्रश्न, अलग मामला। आप टाइप एरर नामक कुछ ढूंढ रहे हैं। – falstro

+0

@row कुछ वाइल्डकार्ड कहा जाता है। –

+3

@ कोडमैन 73: लेकिन आप बस जावा में ऐसा नहीं कर सकते ... जावा सच पैरामीट्रिक बहुरूपता का समर्थन नहीं करता है। यही कारण है कि जब आप "जावा idiosynchrasies" के बजाय "ओओ" पर ध्यान केंद्रित करते हैं तो जावा जेनरिक ज्यादातर व्यर्थ हैं: निश्चित रूप से, वे "संग्रह" और प्रक्रियात्मक कार्यक्रम के लिए ठीक हैं (और इसलिए 99% की मानसिकता अच्छी तरह से फिट हैं वहां जावा डेवलपर्स) लेकिन यह बिल्कुल ओओ नहीं है। जावा में जेनेरिक के साथ यह मेरी सबसे बड़ी पकड़ है: आपके पास * हैंडबल * और * हैंडबल * नहीं हो सकता है और जो ओओ पॉइंट व्यू से जेनेरिक ** बेकार ** प्रस्तुत करता है। – SyntaxT3rr0r

उत्तर

14

जेनिक्स बाइटकोड संकलित होने के बाद मौजूद नहीं है।

इससे प्रतिबंध: आप जेनेरिक पैरामीटर के बिना दो या दो से अधिक इंटरफेस/कक्षाओं को लागू/विस्तारित नहीं कर सकते हैं और जेनेरिक पैरामीटर के साथ अलग हैं।

यदि आप वास्तव में वास्तव में चाहते हैं प्रकार सुरक्षा है तुम कर सकते हो क्या:

interface Foo<T extends Foo<?>> extends Comparable<T> 
interface Bar<T extends Bar<?>> extends Comparable<T> 
abstract class BarDescription<T extends Bar<?>> implements Bar<T> 
class FooBar extends BarDescription<FooBar> implements Foo<FooBar> 
+0

यह काम करने का प्रकार है। मैं अभी भी इसके चारों ओर अपने सिर लपेटने की कोशिश कर रहा हूँ। हमें की आवश्यकता क्यों है, मेरी इच्छा है कि मैंने अपनी मूल पोस्ट को और अधिक ठोस उदाहरणों के साथ बनाया हो। – user26270

+0

इसके अलावा, क्या इंटरफ़ेस Foo > को विस्तारित करने के लिए अनावश्यक नहीं है? एक और मुद्दा यह है कि मेरे पास कई कक्षाएं हैं जो बारडिस्क्रिप्शन का विस्तार करती हैं लेकिन फू नहीं, और अब इन सभी को बारडिस्क्रिप्शन के प्रकार को परिभाषित करना है और तुलना करने के लिए (अन्य बार्डेस्क्रिप्शन) की आवश्यकता है, जैसे कि: क्लास एदरबर्स्क्रिप्शन बारडिस्क्रिप्शन <अन्य बार्डेस्क्रिप्शन> – user26270

+0

हां यह अनावश्यक है। लेकिन जावा जेनरिक में समस्याएं हैं। एक बड़ी समस्या विरासत है (वस्तु के बजाय सुपर प्रकार है?)। उदाहरण के लिए Foo foo = new foo () की अनुमति नहीं है। – mkorpela

8

मैं Comparator रों के एक जोड़े लिखते हैं और इसके साथ किया जाए।

1

जेनेरिक इंटरफेस के कई कार्यान्वयन होने पर वाइल्डकार्ड पर विचार करते समय समस्याएं आती हैं।

यह मिटाने पर निर्भर नहीं है।

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

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