2013-09-04 9 views
14

मुझे इसी तरह के विषय मिल गए हैं, लेकिन अत्यधिक जटिल और काफी समान नहीं हैं। तो बात यह है। यहां (न्यूनतम) कोड है जो 1.6 पर ठीक है, लेकिन 1.7 javac के साथ संकलित नहीं है।जेडीके 1.7 पिछड़ा संगतता तोड़ता है? (जेनेरिक)

public class Test { 
    private static class A<T>{}; 
    private static class B{}; 
    private static class C{}; 

    B doSomething(A<B> arg){ 
     return new B(); 
    } 

    C doSomething(A<C> arg){ 
     return new C(); 
    } 
} 

1,7 त्रुटि पर यह है:

java: name clash: doSomething(Test.A<Test.C>) and doSomething(Test.A<Test.B>) have the same erasure 

मैं प्रकार विलोपन को समझते हैं और यही कारण है कि यह एक गलत कोड है। मुझे समझ में नहीं आ रहा है कि क्यों हम इस परियोजना को हमारे प्रोजेक्ट संकलन और 1.6 में चल रहे हैं, जब 1.7 में समस्याएं हैं। गलत क्या है? क्या यह 1.6 कंपाइलर में एक बग है कि यह हमें ऐसा करने की अनुमति देता है? क्या इसे पुनः लिखने के अलावा 1.7 में काम करना संभव है?

  • JDK1.6 javac संस्करण: 1.6.0_43
  • JDK1.7 javac संस्करण: 1.7.0_25

उत्तर

13

आप कर रहे हैं बहुत सही, JLS3 के तहत इस कोड कभी नहीं तैयार की है और इस था चाहिए 1.6 में एक बग।

1.7 के अधिकांश अंतर्निहित प्रकार की प्रणाली को रिलीज़ करने के लिए अद्यतन किया गया था और यह बग तय किया गया था, परिणाम कुछ पिछड़े संगतता मुद्दों की लागत पर बेहतर प्रकार से हैंडलिंग है।

इसे 1.7 में काम करने के लिए, मेरा मानना ​​है कि पुनः फैक्टरिंग आपका एकमात्र विकल्प है।

+1

स्पष्टीकरण के लिए धन्यवाद । लेकिन मुझे अभी भी यह पसंद नहीं है कि उन्होंने पीछे की संगतता तोड़ दी। – NeplatnyUdaj

+1

@NeplatnyUdaj: एक बग फिक्सिंग पिछड़ा संगतता तोड़ नहीं रहा है। – newacct

+1

@ न्यूवाक्ट: मुझे लगता है कि यह है, क्योंकि बहुत से कोड इस पर निर्भर हो सकते हैं। क्या आप एक डेवलपर को जानते हैं जो पूरे जेएलएस को पढ़ता है? – NeplatnyUdaj

6

जावा 7 में तय किए गए जावैक में यह एक बग है - आप release notes में अधिक जानकारी प्राप्त कर सकते हैं। मुझे डर है कि अपने ही एकमात्र विकल्प यदि आप जावा 7. को

क्षेत्र स्विच करना चाहते हैं कि कोड को फिर से लिखने के लिए है हूँ: उपकरण
सार: एक कक्षा एक ही मिटा हस्ताक्षर के साथ दो तरीके को परिभाषित नहीं किया जा सकता लेकिन दो अलग रिटर्न प्रकार
विवरण: एक वर्ग उसी मिटाए गए हस्ताक्षर के साथ दो विधियों को परिभाषित नहीं कर सकता है, भले ही रिटर्न प्रकार समान हों या नहीं। यह जेएलएस, जावा एसई 7 संस्करण, सेक्शन 8.4.8.3 से मिलता है। जेडीके 6 कंपाइलर एक ही मिटाए गए हस्ताक्षर के साथ विधियों की अनुमति देता है लेकिन अलग-अलग रिटर्न प्रकार; इस व्यवहार गलत है और JDK 7 में तय किया गया है
उदाहरण:

class A { 
    int m(List<String> ls) { return 0; } 
    long m(List<Integer> ls) { return 1; } 
} 

इस कोड JDK 5.0 और JDK 6 के तहत संकलित, और JDK के तहत अस्वीकार कर दिया है 7.

+0

'जावा 5' और' जावा 6' के तहत 'ए' का व्यवहार वास्तव में क्या था?क्या यह वास्तव में उचित विकल्प चुनता था, या क्या यह सिर्फ पहले (या आखिरी) को चुनता था? अगर आप इसे कॉल करने का प्रयास करते हैं, तो कहें, '' सूची? – Kevin

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