2010-01-07 19 views
5

पर पैरामीटरयुक्त विधि के साथ अजीब व्यवहार क्या कोई मुझे बता सकता है कि यह संकलन त्रुटि क्यों देता है? मुझे नहीं लगता कि दूसरे फॉर-लूप में ए को कास्ट क्यों ऑब्जेक्ट्स की सामान्य सूची लौटने के लिए स्ट्रिंग्स() का कारण बनता है।अमूर्त वर्ग

import java.util.ArrayList; 
import java.util.List; 

public class E { 

    public static void main(String[] args) { 
     for (String s : new D().strings()) { 
      System.out.println("s = " + s); 
     } 
     for (String s : ((A) new D()).strings()) { 
      System.out.println("s = " + s); 
     } 
    } 

    static class D extends A<C> { 
    } 

    static abstract class A<T extends B> { 
     List<String> strings() { 
      return new ArrayList<String>() {{ 
       add("Foo"); 
       add("Bar!"); 
      }}; 
     } 
    } 

    static class B { 
    } 

    static class C extends B { 
    } 
} 

क्या यह एक जेनरिक क्विर्क है?

धन्यवाद, क्रिस्टियन

उत्तर

7

लाइन में:

for (String s : ((A) new D()).strings()) { 

आप कच्चे प्रकार A कास्ट कर रहे हैं, तो आप वहाँ प्रकार तर्क जानकारी खो देते हैं। जावा में, कच्चे प्रकार पर किसी भी उपयोग विधि या फ़ील्ड के परिणामस्वरूप कच्चे प्रकार का भी परिणाम होगा (भले ही सभी पैरामीटरयुक्त जानकारी उपलब्ध हों) - अच्छी तरह कच्चे प्रकार या तकनीकी रूप से गैर-पैरामीटरकृत। तो A.string() को List<String> के बजाय कच्चे प्रकार List के रूप में देखा जाता है।

जेएसएल के रूप में Section 4.8 में निर्दिष्ट करता है:

एक निर्माता (§8.8), उदाहरण के विधि (§8.8, §9.4) के प्रकार, या गैर स्थिर क्षेत्र (§8.3) एक कच्चे के एम टाइप सी जो कि अपने सुपरक्लास या सुपरइंटरफेस से विरासत में नहीं है, सी के अनुरूप सामान्य घोषणा में इसके प्रकार का क्षरण है। कच्चे प्रकार सी के स्थिर सदस्य का प्रकार सी के अनुरूप सामान्य घोषणा में समान है।

+3

यह वाकई दिलचस्प है। यह बताता है कि अगर आप केवल ए के बजाय पर आते हैं तो यह काम करता है। उस स्थिति में आप अभी भी एक टाइप की गई कक्षा का उपयोग कर रहे हैं। – Shaun

+0

+1 इस महान उत्तर के लिए धन्यवाद। मैंने अपना जवाब हटा दिया, जो इस के रूप में उतना अच्छा नहीं था। – KLE

+0

@ शॉन, यूप। आंशिक रूप से, कच्चे प्रकारों का उपयोग करने से बचने के लिए आपको परेशान करने की बात है! – notnoop

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