2014-05-01 10 views
7

मुझे, कृपया एक स्पष्टीकरण के लिए पूछें।जावा में नेस्टेड जेनरिक

विधि छदाम अंदर

() मैं सामान्य नेस्टेड वर्ग In<T>

public class A { 

    public static class In<T> { 
    } 

    public static <X> void doit() { 
    new In<X>(); 
    } 
} 

मैं, ज़ाहिर है, भी वर्ग के किसी भी सदस्य तक पहुँच सकते हैं intantiate कर सकते हैं In<T>

public class A { 

    public static class In<T> { 
    public static class Inner<U> { 
    } 
    } 

    public static <X> void doit() { 
    new In.Inner<X>(); 
    } 
} 

मैं अभी भी पहुँच सकते हैं विधि doit() से कक्षा In<T> के सदस्य जब दोनों वर्ग और विधि किसी अन्य वर्ग के अंदर घोंसला होती है कंटेनर

public class A { 

    public static class Container { 

    public static class In<T> { 

     public static class Inner<U> { 
     } 
    } 

    public static <X> void doit() { 
     new In.Inner<X>(); 
    } 
    } 
} 

हालांकि, एक सामान्य बनाने

public class A<V> { 

    public static class Container { 

    public static class In<T> { 

     public static class Inner<U> { 
     } 
    } 

    public static <X> void doit() { 
     new In.Inner<X>(); 
    } 
    } 
} 

संकलक में के रूप में एक त्रुटि excepts: "सदस्य प्रकार A.Container.In, पैरामिट्रीकृत होना चाहिए, क्योंकि यह एक पैरामिट्रीकृत प्रकार के साथ योग्य है"

क्या आप कृपया मुझे स्पष्टीकरण दे सकते हैं?

ध्यान दें कि पिछले कोड कक्षाओं और विधि में स्थिर हैं।

सूचना भी है कि जेनेरिक वर्ग कंटेनर,

public class A<V> { 

    public static class Container<Z> { 

    public static class In<T> { 

     public static class Inner<U> { 
     } 
    } 

    public static <X> void doit() { 
     new In.Inner<X>(); 
    } 
    } 
} 

में कोड को संकलित रूप में बना रही है।

और यह भी निम्नलिखित कोड जहां कंटेनर नहीं रह सामान्य है लेकिन वर्ग Inner<U> के निर्माता की कॉल संकलित अब अधिक योग्य Container.In.Inner<X>()

public class A<V> { 

    public static class Container { 

    public static class In<T> { 

     public static class Inner<U> { 
     } 
    } 

    public static <X> void doit() { 
     new Container.In.Inner<X>(); 
    } 
    } 
} 

धन्यवाद है।

+2

एक्लिप्स (कम से कम मेरे लिए) की समस्या की तरह लगता है ... मैं समस्याग्रस्त कोड को 'javac' के माध्यम से कमांड लाइन से संकलित करने में सक्षम था। –

+0

धन्यवाद @ पावेल, मैं बस सोच रहा था कि जावा के मेरे ज्ञान में कुछ गलत था या नहीं। – rvend

+1

मुझे यह जोड़ना है कि मैंने एक्लिप्स बगजिला के माध्यम से कुछ समय बिताया और वहां कुछ भी नहीं मिला।आपको इसे नवीनतम ग्रहण निर्माण और बग की रिपोर्ट करने की कोशिश करनी चाहिए यदि यह काम नहीं करता है। –

उत्तर

2

कक्षा के static सदस्य होने के नाते एक नेस्टेड क्लास कक्षा के (उदाहरण) प्रकार पैरामीटर पर निर्भर नहीं है। जैसे, अपने उदाहरण में

class A<V> { 

    public static class Container { 

     public static class In<T> { 

      public static class Inner<U> { 
      } 
     } 

     public static <X> void doit() { 
      new In.Inner<X>(); // compilation error 
     } 
    } 
} 

इसमें कोई कारण यह है कि वर्ग उदाहरण निर्माण अभिव्यक्ति

new In.Inner<X>() 

त्रुटि

"The member type A.Container.In must be parameterized, since it is qualified with a parameterized type"

Inner सदस्य प्रकार का कारण होता है एक नेस्टेड वर्ग है In, जो Container का घोंसला वाला वर्ग है, जो A का घोंसला वाला वर्ग है। उनमें से कोई भी उनके घोषित वर्ग में घोषित प्रकार पैरामीटर से कोई संबंध नहीं है।

यह आपके आईडीई में एक बग जैसा लगता है और मैं इसे इस तरह रिपोर्ट करूंगा।

+0

मैं निश्चित रूप से @ सॉटिरियोस से सहमत हूं, साथ ही पावेल ने सुझाव दिया कि जावैक कंपाइलर प्रभावित नहीं है। मेरा जावा आईडीई ग्रहण संस्करण है: 3.6.2 बिल्ड आईडी: एम20110210-1200। – rvend

+1

बग रिपोर्ट बनाई गई - https://bugs.eclipse.org/bugs/show_bug.cgi?id=433989। @rvend आपको इस जवाब को स्वीकार करना चाहिए और 'कंटेनर.इन.इनर ()' का उपयोग करने के कामकाज के साथ जाना चाहिए यदि आप वास्तविक समस्या में इस मुद्दे का सामना करते हैं। –

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