한다고 가정 나는 다음과 같은 클래스가 :제네릭 형식의 추론이 여기서 작동하지 않는 이유는 무엇입니까?
public class STTest {
@Test
public void test() throws Exception {
createInstance(MyTImpl.class);
}
public static<T extends MyT<S, T>, S extends MyS<T, S>> void createInstance(
final Class<? extends MyT<S, T>> beanClass) throws Exception {
final MyT<S, T> bean = beanClass.newInstance();
}
}
확인을 잘 :
이interface MyS<T extends MyT<S, T>, S extends MyS<T, S>> {
}
interface MyT<S extends MyS<T, S>, T extends MyT<S, T>> {
}
public class MySImpl implements MyS<MyTImpl, MySImpl> {
}
public class MyTImpl implements MyT<MySImpl, MyTImpl> {
}
내가 경고없이 컴파일하고 성공적으로 실행되는 테스트 케이스를 다음 구축 할 수 있습니다.
invalid inferred types for S; inferred type does not conform to declared bound(s) inferred: MySImpl bound(s): MyS
왜 이것이다 :
public class STTest {
@Test
public void test() throws Exception {
createInstance(MyTImpl.class);
}
public static<T extends MyT<S, T>, S extends MyS<T, S>> void createInstance(
final Class<T> beanClass) throws Exception {
final T bean = beanClass.newInstance();
}
}
그러나,이 컴파일 오류입니다 :하지만이 동일한 영향을 미칠 것으로 예상?
는 UPDATE :
나는 행동이 컴파일러에 의존하는 것으로 나타났습니다. 코드 컴파일을 위해 OpenJDK 1.6 컴파일러 (javac 1.6.0_27)를 사용했습니다. 그리고 그것은 부서집니다. 그러나 :
- 오픈 JDK 1.7 컴파일러 (javac의 1.7.0_21) 및
- 오라클 1.6 컴파일러 (javac의 1.6.0_37)
두 번째 예에서 모두 잘 작동.
그러나 이것은 OpenJDK 1.6 컴파일러의 버그입니까? 아니면 Java 언어 사양의 모호성입니까?
코드를 실행할 수 있으며 컴파일 오류가 발생하지 않습니다. – darijan
여기에 있습니다. 인터페이스 선언시 괄호가 누락 된 경우에만 컴파일 오류가 발생합니다. –
Java 7 용 Eclipse 컴파일러와 함께 컴파일되도록 추가하겠습니다. –