2012-08-01 12 views
12

संभव डुप्लिकेट:
Type-parameterized field of a generic class becomes invisible after upgrading to Java 7पैरामीटर का निजी फ़ील्ड जावा 6 में जेनेरिक विधि के लिए क्यों दिखाई देता है लेकिन जावा 7 में नहीं?

public class Test{ 

    private String _canYouSeeMe = "yes"; 

    <T extends Test> void genericMethod(T hey){ 
     String s = hey._canYouSeeMe; 
    } 

    void method(Test hey){ 
     String s = hey._canYouSeeMe; 
    } 
} 

जब JDK 1.6 के खिलाफ निर्माण इस ठीक संकलित लेकिन 1.7 के खिलाफ genericMethod() में एक संकलक त्रुटि है: क्षेत्र टेस्ट। _canYouSeeMe दिखाई नहीं दे रहा है

त्रुटि को _canYouSeeMe संरक्षित करके हल किया जा सकता है निजी की तुलना में है, लेकिन मैं बस सोच रहा हूँ क्या 1.6 से 1.7

+2

त्रुटि या चेतावनी संकलन होगा? – kosa

+0

क्यों नहीं? यह एक ही कक्षा का एक तरीका है, है ना? और गैर स्थैतिक भी। – Qnan

+0

@fmucar openjdk 1.6.0_24 के साथ यहां संकलित ठीक है। –

उत्तर

7

उपवर्गों (T) एक वर्ग के लिए बदल गया है (Test) कभी नहीं सुपर क्लास 'निजी क्षेत्रों की पहुंच है। यह जावा 6 कंपाइलर में एक बग था जो जावा 7 में तय किया गया था।

याद रखें: T extends Test का अर्थ है कि TTest का उप-वर्ग है। यह का अर्थ है कि T की कक्षा Test.class है, जो निजी क्षेत्र & विधि पहुंच के लिए आवश्यक शर्त है।

+0

यह आंशिक रूप से सच है, लेकिन चूंकि निजी क्षेत्र तक पहुंचने वाला कोड सुपरक्लास में है, तो मैं कहूंगा कि इसका उपयोग – Qnan

+2

@Matt: मुझे प्राप्त नहीं होना चाहिए। यदि यह सत्य था, तो 'हे' को 'टेस्ट' कास्टिंग क्यों किया जाता है (जो पूरी तरह से वैध है और चेतावनी भी नहीं देता है) आइए हम '_canYouSeeMe' तक पहुंचें? –

+0

+1 जावा 6 में कई बग्स को असंगतता से बचने के लिए जावा 7 तक तय नहीं किया गया था। –

1

@ जोचिम के जवाब में - एक टिप्पणी के लिए बहुत लंबा।

यह तथ्य यह है कि इस संकलन नहीं होगा के साथ संगत है:

void method(SubTest hey) { 
    String s = hey._canYouSeeMe; 
} 

(जहां सब्टॅस्ट टेस्ट फैली) जबकि इस

void method(SubTest hey) { 
    String s = ((Test) hey)._canYouSeeMe; 
} 
+0

दूसरा उदाहरण संकलित नहीं करता है (जावा 6 और 7 दोनों में) जब 'सबटेस्ट' एक शीर्ष-स्तरीय वर्ग है। –

+0

@ मैटबॉल: क्यों नहीं? जब तक 'सबटेस्ट' 'टेस्ट' बढ़ाता है। यह मेरे लिए संकलित करता है। –

+0

@ मैटबॉल यदि 'विधि' टेस्ट का सदस्य है, तो यह संकलित करता है, भले ही' सबटेस्ट 'शीर्ष स्तर की कक्षा हो। – assylias

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