2015-06-30 6 views
6

निम्नलिखित कोड एक "जेनेरिक सरणी निर्माण" त्रुटि देता है।मैं सामान्य प्रकार की आंतरिक कक्षा का सरणी क्यों नहीं बना सकता?

public class TestClass<K, V> { 
    Entry[] entry; 

    private TestClass() { 
     entry = new Entry[10]; // <--- this line gives generic array creation error 
    } 

    private class Entry { 
     public Entry() { 

     } 
    } 
} 

मैं सोच रहा हूँ क्यों इस है, क्योंकि वर्ग Entry एक सामान्य वर्ग नहीं है और सामान्य प्रकार का कोई वस्तुएं हैं।

क्या ऐसा इसलिए है क्योंकि आंतरिक वर्ग में अभी भी सामान्य प्रकार तक पहुंच है, भले ही यह किसी का उपयोग न करे? यह सबसे अच्छा है जिसके साथ मैं आ सकता हूं, हालांकि अगर यह मामला था, तो मुझे समझ में नहीं आया कि जावा क्यों नहीं देख सकता था और देखता है कि यह सामान्य प्रकार का उपयोग नहीं करता है और इसलिए एक सामान्य वर्ग नहीं है?

और हाँ, मैंने सामान्य प्रकार के सरणी के बारे में कई सारे धागे देखे हैं, लेकिन नहीं, मुझे आंतरिक कक्षाओं के बारे में कोई भी नहीं मिला है।

उत्तर

6

प्रकार वास्तव में TestClass<K, V>.Entry है (हाँ ऐसा इसलिए है क्योंकि यह एक आंतरिक वर्ग है)।

private static class Entry { 
    public Entry() { 

    } 
} 
+0

... एकदम सही बनाता है भावना :) धन्यवाद करेंगे:

entry = new TestClass.Entry[10]; 

या एकांतर वाइल्डकार्ड-पैरामिट्रीकृत प्रकार के साथ: जवाब है कि आप स्पष्ट रूप से कच्चे बाहरी वर्ग प्रकार के साथ Entry योग्य होना चाहिए है जब यह मुझे देता है तो सही के रूप में चिह्नित करें। – andy

4

क्या JLS के सरणी निर्माण अभिव्यक्ति के बारे में बात के बारे में है कि:

ArrayCreationExpression: 
    [...] 
    new ClassOrInterfaceType DimExprs [Dims] 
    [...] 

JLS 15.10.1:

यह एक है आप एक नेस्टेड स्थिर कक्षा में बदलने के द्वारा इस हल कर सकते हैं संकलन-समय त्रुटि अगर ClassOrInterfaceType पुन: प्रयोज्य प्रकार (§4.7) को इंगित नहीं करता है। अन्यथा, ClassOrInterfaceType नाम नामित किसी भी संदर्भ प्रकार, यहां तक ​​कि एक अमूर्त वर्ग प्रकार (§8.1.1.1) या इंटरफ़ेस प्रकार का नाम हो सकता है।

JLS 4.7:

एक प्रकार reifiable है यदि और केवल यदि निम्न में से एक रखती है:

  • यह एक गैर सामान्य वर्ग या इंटरफ़ेस प्रकार घोषणा को दर्शाता है।

  • यह एक पैरामीटरयुक्त प्रकार है जिसमें सभी प्रकार के तर्क असंबद्ध वाइल्डकार्ड (§4.5.1) हैं।

  • यह एक कच्चा प्रकार (§4.8) है।

  • यह एक आदिम प्रकार (§4.2) है।

  • यह एक सरणी प्रकार (§10.1) है जिसका तत्व प्रकार पुनः प्राप्त करने योग्य है।

0

Entry एक गैर स्थिर भीतरी वर्ग है। इसका मतलब है कि यह बाहरी वर्ग के सामान्य मानकों के दायरे में है। हर बार जब आप TestClass के अंदर एक अयोग्य Entry लिखते हैं, तो इसका अर्थ है TestClass<K,V>.Entry, जो एक पैरामीटरयुक्त प्रकार है! जैसा कि आप जानते हैं, आप पैरामीटरयुक्त प्रकार के सरणी नहीं बना सकते हैं, उदा। आप new ArrayList<String>[5] नहीं कर सकते हैं।

आमतौर पर, एक पैरामिट्रीकृत प्रकार की सरणियों बनाने के लिए वैकल्पिक हल के बजाय कच्चे प्रकार की एक सरणी बनाने के लिए है, यानी new ArrayList[5], या वाइल्डकार्ड-पैरामिट्रीकृत प्रकार की एक सरणी है, यानी new ArrayList<?>[5] है। लेकिन इस मामले में, कच्चा प्रकार क्या है? ,

entry = (Entry[])new TestClass<?>.Entry[10]; 
संबंधित मुद्दे