2009-04-16 10 views
7

कौन सही है? ग्रहण या जावैक?एक्लिप्स कंपाइलर या जावैक में बग?

--------------- सी/वी/A.java ---------------

package c.v; 
public class A<T> { 
} 

- ------------- सी/वी/बीजेवा ---------------

package c.v; 
public class B extends A<B.Secret> { 
    private class Secret {}; 
} 

ग्रहण संकलित बीजेवा बस ठीक है।

जावैक में कोई समस्या है।

$ javac c/v/B.java 
c/v/B.java:3: c.v.B.Secret has private access in c.v.B 
public class B extends A<B.Secret> { 
         ^
    1 error 

उत्तर

7

Java Language Specification के प्रासंगिक भागों होना चाहिए:

§8.1.4: [... ] क्लासटाइप को एक सुलभ (§6.6) वर्ग प्रकार का नाम देना चाहिए, या संकलन-समय त्रुटि उत्पन्न होती है।

§6.6.1: [...] एक सदस्य के लिए एक संदर्भ (वर्ग, इंटरफ़ेस, या सरणी) का (वर्ग, इंटरफ़ेस, क्षेत्र, या विधि) लिख सकते हैं या एक वर्ग प्रकार के एक निर्माता सुलभ केवल है यदि प्रकार पहुंच योग्य है और सदस्य या कन्स्ट्रक्टर को पहुंच की अनुमति देने के लिए घोषित किया गया है:

  • यदि सदस्य या निर्माता को सार्वजनिक घोषित किया गया है, तो एक्सेस की अनुमति है। इंटरफेस के सभी सदस्य पूरी तरह से सार्वजनिक हैं। [...]
    • अन्यथा, यदि किसी सदस्य या निर्माता निजी घोषित किया जाता है, तो पहुँच यदि और केवल यदि यह शीर्ष स्तर वर्ग के शरीर के भीतर होता है (§7.6) है कि की घोषणा encloses अनुमति दी है सदस्य या निर्माता।

तो बाद ClassType वर्ग के शरीर के भीतर नहीं है, B.Secret नहीं इस स्थान पर सुलभ है, तो A<B.Secret> नहीं पहुंच नहीं है, तो एक संकलन समय त्रुटि उत्पन्न करना चाहिए।

+0

मुझे लगता है कि यह उत्तर सही है हालांकि जेएलएस द्वारा शीर्ष स्तर की कक्षा के शरीर के लिए प्रतिबंध मूर्खतापूर्ण है। शीर्ष स्तर की कक्षा के वर्ग घोषणा (और विशेष रूप से प्रकार पैरामीटर) तक विस्तार करने के लिए OUGHT तक पहुंचें। – Eric

3

मुझे लगता है कि करने के लिए javac सही है करते हैं। एक नई कक्षा

A<B.Secret> 

जेनेरिक आवश्यकताओं को उस वर्ग तक पहुंच प्राप्त करने के लिए उपयोग करने के लिए। तथ्य यह है कि बी उस वर्ग को विस्तारित करता है वह मामूली है।

6

ग्रहण गलत है। आप के रूप में

extends A<X> 

कुछ विज्ञापन करते हैं तो आप और दोनों एक के बारे में पता करने की जरूरत, एक्स

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