code

Eclipse 컴파일러 또는 javac의 버그 ( "T의 유형 매개 변수를 결정할 수 없음")

codestyles 2020. 10. 22. 08:02
반응형

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))));
}

이렇게하면 호출자가 결과 유형을 지정해야하며 컴파일러는 결과를 캐스팅하는 방법을 알고 있습니다.

참고 URL : https://stackoverflow.com/questions/314572/bug-in-eclipse-compiler-or-in-javac-type-parameters-of-t-cannot-be-determined

반응형