다음 테스트에서 TesterClass는 두 개의 형식 매개 변수 사이의 관계에 제약 조건을 배치합니다. func2() 메서드는 해당 제약 조건을 벗어나는 것처럼 보입니다. func2의 정의에 따라 또는 클래스가 String 이외의 두 번째 매개 변수와 함께 사용될 때마다 입력 컴파일 오류가 발생할 것으로 예상되지만 그렇지 않습니다.왜 컴파일됩니까? 코드가 형식 매개 변수에 대한 제한 조건을 위반하는 것 같습니다
또한 func2를 호출하고 결과를 적절히 유형이 지정된 변수에 저장하면 해당 변수의 유형에 따라 컴파일이 실패합니다. 그러나 함수의 반환 형식이 두 경우 (위쪽 캐스트 전)에 동일한 형식을 가져야 함에도 불구하고 동일하게 수행하고보다 일반적인 형식 (예 : Object)으로 저장하는 것은 성공합니다.
여기 무슨 일 이니?
감사합니다.
public class TestGenerics {
public static class ParamedType<T> {}
public class TesterClass<A extends ParamedType<B>, B> {
public TesterClass<A, B> func() {
return new TesterClass<A, B>();
}
public TesterClass<A, String> func2() {
return new TesterClass<A, String>();
}
}
public Object test() {
// How can I use these type parameters? Doesn't .func2 now have an invalid return type?
TesterClass<ParamedType<Integer>,Integer> testClass = new TesterClass<TestGenerics.ParamedType<Integer>, Integer>();
//TesterClass<ParamedType<String>, Integer> res2 = testClass.func2(); // <-- will not compile
Object res = testClass.func2(); // Compiles
return res;
}
}
편집 :이 은 javac의 컴파일하지 않습니다 (버전은 아래에보고 됨). Eclipse를 사용하고 실제로 실행중인 컴파일러가 무엇인지 알아 내려고합니다. 업데이트됩니다. JDT (Eclipse 컴파일러) 버그 일 수 있습니다.
나는 일식의 JDT에 대한 버그 리포트를 열었습니다: https://bugs.eclipse.org/bugs/show_bug.cgi?id=333503
javac 1.6.0_21 나를 컴파일하지 않습니다. – axtavt
Java 6.0 준수 수준의 Eclipse 컴파일러에서 컴파일 –
코드 끝에 누락 된 중괄호가 있지만 컴파일되지 않습니다 (JDK 1.6.0_20의 javac를 통해). – kvista