2011-02-22 7 views
3
<X> X foo(List<? super X> list) 
{ 
    return null; 
} 
void test() 
{ 
    List<Number> list = ...; 
    String s1 = this.foo(list); // huh? 
} 

마지막 줄에는 아무런 의미가 없습니다. javac에서 어떻게 허용합니까?왜이 일반 코드가 컴파일됩니까?

이제 foo() 방법도 의미가 없습니다. null를 돌려 줄 필요가있어, 형태 보증 된 방식으로 돌려 줄 수가있는 값은 없습니다. 따라서 런타임의 마지막 줄에는 아무런 문제가 발생하지 않습니다. String 변수에 null을 할당합니다.

여전히 정적으로 왜 마지막 줄이 컴파일됩니까? (javac 1.6 u21 b06)

+0

'형식 불일치 : 숫자에서 문자열로 변환 할 수 없습니다. '오류가 발생합니다. –

+0

가 작동하지 않습니다. –

+0

컴파일되지 않습니다. – GriffeyDog

답변

0

코드는 다음 JDK 버전 1.6.0_22-b04로 컴파일되지 않습니다. 오류는 다음과 같습니다 불일치

유형 : 나는 컴파일러의 버그가 당신의 제안에 해당 할 수 있습니다 생각 번호에서 문자열

로 변환 할 수 없습니다.

+0

재미 있기 때문에이 컴파일러는 X = Number를 먼저 추론합니다. . 그것은 사양에도 부합하지 않습니다. – irreputable

+0

'$ javac -version javac 1.6.0_26'은 여전히 ​​컴파일됩니다 (이클립스 컴파일러는 컴파일되지 않습니다) –

0

코드가 컴파일되지 않습니다. 메서드의 반환 유형은 <X>입니다. foo 메서드를 호출하면 템플릿 매개 변수 Number으로 전달됩니다. String에 null을 할당 할 수 있지만 메서드의 서명은 Number foo()이되어 Number을 반환합니다. 따라서 컴파일러에서는 NumberString에 할당 할 수 없습니다.

+0

그것은'javac 1.6 u21 b06' – irreputable

4

당신은 어떤 컴파일러를 사용합니까?

아마도 이클립스를 사용하고 있습니다. 왜냐하면 컴파일되지 않기 때문입니다. 그러나 명령 행에서 컴파일됩니다. 런타임 문제를 더 빨리 발견하기 위해 Eclipse에는 약간 다른 컴파일 메커니즘이 있습니다. 때로는 단지 경고 일 뿐이므로 오류입니다.

List<? super X>List<X> 또는 List<Object> 일 수 있음을 의미합니다. 따라서 컴파일 할 수 있습니다. 반면에 실행되지는 않지만 javac은 상관 없습니다. 코드가 컴파일됩니다.

+0

으로 컴파일됩니다. 목록에 제네릭이 실제로 표시 될 것입니다.) – Jorn

관련 문제