2012-08-01 2 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을 오히려 보호하여 해결할 수 있습니다. 개인보다,하지만 난 단지 클래스의 1.7

+2

오류 또는 경고를 컴파일 할 것입니다 반면 (하위 검사는 테스트를 확장 경우)? – kosa

+0

왜 안 되니? 이게 같은 클래스의 방법이지, 안 그래? 그리고 비 정적이기도합니다. – Qnan

+0

@fmucar 여기에서 openjdk 1.6.0_24로 잘 컴파일되었습니다. –

답변

7

서브 클래스 (T) 1.6에서 변경된 내용을 궁금하네요 (Test) 는 슈퍼 클래스의 개인 필드에 액세스 할 수 없습니다. 이것은 Java 7에서 수정 된 Java 6 컴파일러의 버그 일 가능성이 높습니다.

기억 : 은 Test의 하위 클래스입니다. 이 아닌T의 클래스가 Test.class이라는 것을 의미하며 이는 개인 필드 & 메소드 액세스가 필요한 조건입니다.

+0

이 부분적으로 사실이지만 개인 필드에 액세스하는 코드가 수퍼 클래스 자체에 있기 때문에 액세스가 있어야합니다. – Qnan

+2

@Matt : 이해가 가지 않습니다. 그게 사실이라면, 왜'시험 '에'헤이'를 던지면 (완전히 합법적이고 경고를 내지지도조차 않습니다)'_canYouSeeMe'에 액세스 할 수 있습니까? –

+0

+1 Java 6의 버그 수는 Java 7에서 수정되어 호환되지 않는 것을 방지했습니다. –

1

@Joachim에 대한 답글 - 너무 오랫동안 의견을 남깁니다.

그것은이 컴파일되지 것이라는 사실과 일치한다 :

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

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

두 번째 예제는'SubTest'가 최상위 클래스 인 경우 Java 6 및 7에서 컴파일하지 않습니다. –

+0

@MattBall : 왜 안 되니? SubTest가 Test를 확장하는 한. 그것은 나를 위해 컴파일됩니다. –

+0

@MattBall'method'가 Test의 멤버라면'SubTest'가 최상위 클래스 인 경우에도 컴파일됩니다. – assylias