2012-08-01 55 views
12

可能重複:
Type-parameterized field of a generic class becomes invisible after upgrading to Java 7爲什麼參數的專用字段對Java 6中的泛型方法可見但對Java 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 2012-08-01 14:25:22

+0

爲什麼不呢?這是同一班的方法,不是嗎?也是非靜態的。 – Qnan 2012-08-01 14:28:34

+0

@fmucar用openjdk 1.6.0_24編譯得很好。 – 2012-08-01 14:31:41

回答

7

子類(T)一類(Test從未訪問父類的私有字段。這可能是Java 7編譯器中Java 7中修復的一個bug。

記住:T extends Test意味着TTest的子類。它確實是而不是的意思是T的等級是Test.class,這是私人領域&方法訪問的必要條件。

+0

這是部分正確的,但由於訪問私有字段的代碼是在超類本身中,我會說它應該有訪問 – Qnan 2012-08-01 14:34:05

+2

@Matt:我不明白。如果那是真的,那麼爲什麼要將'hey'投射到'Test'(這是完全合法的,甚至不會產生警告)讓我們訪問'_canYouSeeMe'? – 2012-08-01 14:35:20

+0

+1 Java 6中的一些錯誤在Java 7之前並未修復,以避免導致不兼容。 – 2012-08-01 14:36:38

1

回覆@Joachim - 太長的評論。

這是事實,這不會編譯一致:

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

(其中分測驗擴展測試),而這將彙編

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

當SubTest是頂級類時,第二個示例不會編譯(在Java 6和7中)。 – 2012-08-01 14:46:02

+0

@MattBall:爲什麼不呢?只要'SubTest'擴展'Test'。它爲我編譯。 – 2012-08-01 14:50:52

+0

@MattBall如果'method'是Test的成員,即使'SubTest'是頂級類,它也會進行編譯。 – assylias 2012-08-01 14:56:05

相關問題