2011-12-14 16 views
5

छुपा मैं एक वर्ग को परिभाषित कर रहा हूँ: I के बारे में I से छिपा हुआ जा रहाजावा जेनरिक प्रकार पैरामीटर

class Foo<I extends Bar & Comparable<I>> { 
} 

संकलक शिकायत कर रहा है। मुझे लगता है कि दूसरी बार I परिभाषा में प्रकट होता है, पहली बार गुंजाइश में छुपा रहा है, जैसे कि चर I दो अलग-अलग प्रकारों को असाइन किया जा सकता है। इसे सही तरीके से कैसे करें?

संपादित करें:

यह एक आंतरिक वर्ग है। पूर्ण कोड हो सकता है:

class Baz<I> { 
    class Foo<I extends Bar & Comparable<I>> { 
    } 
} 

अब समस्या यह है कि अगर मैं IJ के भीतर फिर से मनोनीत, मुझे यकीन है कि I और J वास्तव में एक ही प्रकार के होते हैं नहीं कर रहा हूँ है।

+4

मेरे लिए संकलित - क्या आपके कोड में कहीं और परिभाषित 'I' है? –

+1

वही, मेरे लिए कोई चेतावनी नहीं। – n1r3

+1

तीसरा है कि। ठीक संकलित करता है। – asenovm

उत्तर

9

भीतरी वर्ग पैरामिट्रीकृत मत बनाओ चूंकि प्रत्येक Foo के बाहरी Baz उदाहरण के लिए एक अंतर्निहित संदर्भ होगा।

+0

मैं इसे स्वीकार करूँगा क्योंकि यह मेरे प्रश्न का उत्तर देता है। यह एक गलत सवाल की तरह लग सकता है लेकिन मेरी समस्या अलग थी और मैंने इसे बाद में खोजा। मेरी समस्या यह थी कि आंतरिक वर्ग वास्तव में एक आंतरिक इंटरफ़ेस था। आंतरिक इंटरफ़ेस में स्पष्ट रूप से बताए जाने वाले प्रकारों से बच नहीं सकते हैं, और आंतरिक आंतरिक इंटरफेस को लागू करने वाले आंतरिक वर्गों के लिए सब कुछ गड़बड़ कर दिया गया है ... – marcorossi

3

हैं I पहले से ही बाहरी कक्षा में परिभाषित किया गया है सिर्फ इस

public class Outer<I extends Bar & Comparable<I>> { 
    public class Foo<I> { 
    } 
} 

आप अपने भीतर कक्षा में I को फिर से परिभाषित नहीं कर सकते हैं। आंतरिक कक्षा के I बाहरी वर्ग के I से कुछ और होगा, यदि आप यही चाहते हैं, तो इसका नाम बदलें। के रूप में Baz घोषणा में परिभाषित अभी भी Foo में अर्थ होगा

class Baz<I extends Bar & Comparable<I>> { 
    class Foo { 
    } 
} 

एक आंतरिक (गैर स्थिर नेस्ट) वर्ग के रूप में, I,:

HTH

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