2011-12-28 60 views
8

मैं इस Why does a generic cast of a List<? extends Set..> to List<Set..> succeed on Sun JDK 6 but fail to compile on Oracle JDK 7?जेडीके 6 की तुलना में जेडीके 7 में अधिक अनुमानक टाइप करें?

से संबंधित हो सकती लगता है कि हम निम्नलिखित वर्गों लेते हैं, वे ठीक JDK 6 के तहत संकलन:

:

public final class Foo<V> { 

    private final V value; 

    private Foo(final V value) { 

     this.value = value; 
    } 

    public static <T, R extends T> Foo<T> of(final R value) { 

     return new Foo<T>(value); 
    } 
} 

final class Tester { 

    @Test(groups="unit") 

    public static void test() { 

     bar(Foo.of(BigDecimal.ZERO)); // This line fails in JDK 7 but not JDK 6 
    } 

    private static void bar(final Foo<? extends Number> target) { 

     assert target != null; 
    } 
} 

हालांकि, JDK 7 के तहत, मैं निम्न त्रुटि प्राप्त

[ERROR] \work\fsb-core\src\test\java\com\fsb\core\Foo.java:[42,8] error: 
       method bar in class Tester cannot be applied to given types; 

मैंने सोचा था कि जेडीके 7 में टाइप अनुमान कम प्रतिबंधक था (उदाहरण के लिए, कन्स्ट्रक्टर अनुमान जोड़ना)। हालांकि, कंपाइलर जेडीके 6 के तहत मान्य एक प्रकार को अस्वीकार कर रहा है।

क्या यह एक बग है? या तरीकों के लिए अनुमान अधिक नियम बनाये गए थे?

+0

जावा 8 (1.8.0_25) यह फिर से ठीक है। – Lii

उत्तर

3

spec के अनुसार कड़ाई से, T अनुमानित नहीं किया जा सकता है (प्रति 15.12.2.7), इसलिए इसे Object के रूप में लिया जाना चाहिए।

इसे स्पेक की विफलता के रूप में देखा जा सकता है। इस प्रकार spec R का उल्लंघन करता है: पहले R :> BigDecimal बाधा है, जहां :> का अर्थ है का सुपरटेप है। अनुमान नियम तब R=BigDecimal चुनते हैं क्योंकि यह सबसे विशिष्ट प्रकार की बाधा को संतुष्ट करता है।

अब, T:>R, T:>BigDecimal से, किसी को लगता है कि यह T=BigDecimal भी पैदा करेगा।

दुर्भाग्य से अनुमान नियम T:>R खाते में नहीं लेते हैं। T पर कोई बाधा नहीं है। T एक ही सिद्धांत के माध्यम से अनुमानित नहीं है।

हालांकि यह बेकार है, spec spec है। आपका कोड संकलित नहीं होना चाहिए। Javac6 वहाँ गलत है।

जावा 8 में लैम्ब्डा अभिव्यक्ति का उपयोग करने में आसान बनाने के लिए अनुमान नियमों में एक बड़ा सुधार है। उम्मीद है कि आपका कोड जावा 8 में संकलित होना चाहिए।

+0

स्पष्टीकरण के लिए धन्यवाद। मुझे राहत मिली है कि जेडीके 7 में टाइप अनुमान सही है (कुछ हद तक निराश यह केवल जेडीके 6 में गलती से काम करता है)। ऐसा लगता है कि यह संबंधित है: http://www.oracle.com/technetwork/java/javase/compatibility-417013.html। (मूल रूप से http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6638712 पर संदर्भित)। – Saish

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