아시다시피 Java에서 제네릭의 주요 목적 중 하나는 컴파일 타임 형식 안전을 제공하는 것입니다. 컴파일되면 코드는 문제없이 실행됩니다.문자열이 컴파일 오류없이 목록에 할당 됨
다음 코드가 컴파일되는 이유는 무엇입니까?
public static void main(String[] args) {
String s = getList();
}
private static <T extends List> T getList() {
return (T)new ArrayList();
}
잘 컴파일됩니다. 내 형식 안전한 컴파일은 어디에 있습니까? getList()
메서드는 String
클래스와 공통점이 없습니다.
아니요. 원시가 아닌 유형을 사용하는 경우에도 컴파일됩니다. –
@MarkusFischer, 나는 또한 그것에 대해 생각했지만 컴파일러는 String이 최종 클래스이고 어떤 서브 클래스도 가질 수 없다는 것을 깨닫습니다. – Andrew
@ MarkusFischer,이 주석을 대답으로 변환해야합니다. 나는 이것이 바로 여기서 관찰 된 문제라고 생각합니다. 필자가 말했듯이 컴파일러는 문자열을 'final'로 간주하지 않으므로 컴파일시에 'MyClass extends String implements List'를 사용할 수 있습니다. – Zabuza