Eclipse 컴파일러 또는 javac의 버그 ( "T의 유형 매개 변수를 결정할 수 없음")
다음 코드
public class GenericsTest2 {
public static void main(String[] args) throws Exception {
Integer i = readObject(args[0]);
System.out.println(i);
}
public static <T> T readObject(String file) throws Exception {
return readObject(new ObjectInputStream(new FileInputStream(file)));
// closing the stream in finally removed to get a small example
}
@SuppressWarnings("unchecked")
public static <T> T readObject(ObjectInputStream stream) throws Exception {
return (T)stream.readObject();
}
}
Eclipse에서 컴파일되지만 javac로는 컴파일되지 않습니다 (T의 유형 매개 변수를 판별 할 수 없습니다. 상한이 T, java.lang.Object 인 유형 변수 T에 대해 고유 한 최대 인스턴스가 존재하지 않음).
readObject (String file)를 다음과 같이 변경하면
@SuppressWarnings("unchecked")
public static <T> T readObject(String file) throws Exception {
return (T)readObject(new ObjectInputStream(new FileInputStream(file)));
}
Eclipse와 javac로 컴파일됩니다. 누가 맞습니까, Eclipse 컴파일러 또는 javac?
여기 와 여기에 보고 된 Sun 컴파일러의 버그라고 말하고 싶습니다. 아래 줄로 변경하면 버그 보고서에 정확히 설명 된 것처럼 보이기 때문에 두 줄 모두에서 작동하기 때문입니다.
return GenericsTest2.<T>readObject(new ObjectInputStream(new FileInputStream(file)));
이 경우 코드가 잘못되었다고 말하고 싶습니다 (그리고 Sun 컴파일러가 맞습니다). readObject
실제로 유형을 유추 할 입력 인수에는 아무것도 없습니다 T
. 이 경우 Object를 반환하고 클라이언트가 결과 유형을 수동으로 캐스팅하도록하는 것이 좋습니다.
이것은 작동합니다 (테스트하지는 않았지만).
public static <T> T readObject(String file) throws Exception {
return GenericsTest2.<T>readObject(new ObjectInputStream(new FileInputStream(file)));
}
Oracle JDK6 u22가 정확해야하지만 JDK6 u24에도이 문제가 있습니다.
이것은 이클립스 버그 98379 의 버그입니다 .
이것은 수정되지 않았지만 이클립스 버그의 예제와 같은 해결 방법을 통해 문제가 해결되었습니다 (링크 참조).
Java 버전 "1.6.0_22"에서이 문제를 발견했습니다. 업데이트 25에서 수정되어 자바 버전 "1.6.0_32"로 업그레이드하면 사라졌습니다.
호출시 투명하게 작동하도록 readObject 메서드를 수정할 수있는 경우 다음을 사용할 수도 있습니다.
public static <T> T readObject(String file, Class<T> type) throws Exception {
return type.cast(readObject(new ObjectInputStream(new FileInputStream(file))));
}
이렇게하면 호출자가 결과 유형을 지정해야하며 컴파일러는 결과를 캐스팅하는 방법을 알고 있습니다.
'code' 카테고리의 다른 글
수은의 모범 사례 : 분기 대 복제, 부분 병합? (0) | 2020.10.22 |
---|---|
node.js에서 지원되는 Javascript 버전 (0) | 2020.10.22 |
값으로 전달할 때 "const"가 중복되지 않습니까? (0) | 2020.10.21 |
Go 맵에서 항목을 계산하는 방법은 무엇입니까? (0) | 2020.10.21 |
CSS FlexBox 레이아웃의 이미지 자동 크기 조정 및 종횡비 유지? (0) | 2020.10.21 |