2015-10-08 6 views
6

इंटरफेस की आवश्यकता है एक चौराहे प्रकार का उपयोग करने में असमर्थ: javac 1.8.0_60 साथ संकलित करने के लिएजब काल्पनिक वर्ग पहुँच संशोधन

@SuppressWarnings("unchecked") 
<E extends PublicCloneable & HasPosition> E cloneAndIncrementPosition(E elem) { 
    final E clone = (E)elem.clone(); 
    // rest omitted 
} 

प्रयास::

$ javac xx.java 
xx.java:13: error: clone() in Object cannot implement clone() in PublicCloneable 
    <E extends PublicCloneable & HasPosition> E cloneAndIncrementPosition(E elem) { 
    ^
    attempting to assign weaker access privileges; was public 
xx.java:14: error: clone() has protected access in Object 
     final E clone = (E)elem.clone(); 
          ^
2 errors 

चौराहे प्रकार का उपयोग करने

interface PublicCloneable { 
    Object clone(); 
} 

interface HasPosition { 
    // doesn't matter 
} 

प्रयास Javac के लिए यह चौराहे प्रकार क्यों अमान्य है?

+0

दिलचस्प बात यह है कि यदि आप 'ई' से ऊपरी सीमा 'हैसपॉजिशन' को हटाते हैं, तो यह संकलित करता है। – rgettman

+0

यह ग्रहण पर संकलित करता है ... –

उत्तर

8

यह एक जावैक बग की तरह दिखता है।

http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.4

बाध्य टी के साथ एक प्रकार चर एक्स के सदस्यों

& I1 & ... & में चौराहे प्रकार के सदस्य हैं (§4.9) टी & I1 & ... &

में

http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.9

हर चौराहे प्रकार T1 & ... & Tn एक काल्पनिक वर्ग या चौराहे प्रकार के सदस्यों की पहचान करने के उद्देश्य के लिए इंटरफ़ेस को प्रेरित करता है ...

तो सी.के. वस्तु, एक काल्पनिक इंटरफ़ेस प्रेरित है ... है प्रत्यक्ष superinterfaces टी 1 ', ..., Tn'

इसलिए, PublicCloneable & HasPosition के लिए, एक काल्पनिक इंटरफेस, शुरू की है उन दोनों को है, जो ठीक होना चाहिए विस्तार।

+0

धन्यवाद, यही वह है जिसे मैं संदेह कर रहा था। खुशी है कि आप सहमत हैं। – Archie

+1

ठीक है, spec का यह हिस्सा बुरी तरह लिखा गया है, और यह नज़दीकी रूप से सुसंगत नहीं है। किसी भी मामले में, आपका उपयोग केस पूरी तरह से कानूनी दिखता है और इसे स्वीकार किया जाना चाहिए। – ZhongYu

+0

स्पष्टीकरण के लिए धन्यवाद! इस त्रुटि को दबाने और ऐसे कोड को संकलित करने के किसी भी तरीके? –

0

जैसा कि पहली त्रुटि आपको बताने की कोशिश कर रही है, आपका कोड काम नहीं कर सकता है, क्योंकि आप clone() विधि के लिए दो असंगत हस्ताक्षर वाले प्रकारों को बाध्य कर रहे हैं।

+0

उदा।, 'हैस्पोजिशन' का 'क्लोन' ('ऑब्जेक्ट' से विरासत में मिला है) 'संरक्षित' है, लेकिन 'पब्लिकक्लोनेबल' क्लोन', क्योंकि यह एक इंटरफेस है, 'सार्वजनिक' है। क्या वह सही है? –

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