假设我有以下类:
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> {
}
我可以构建以下测试用例,它可以成功编译和运行,而且没有任何警告:
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();
}
}
好的,没问题。但是我希望这样做能够产生相同的效果:
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();
}
}
然而,这是一个编译错误:
S的推断类型无效;推断类型不符合声明的边界 inferred: MySImpl bound(s): MyS
为什么会出现这种情况?
更新:
我注意到这种行为与编译器有关。我使用了OpenJDK 1.6编译器(javac 1.6.0_27)进行编译,但它失败了。然而:
- OpenJDK 1.7编译器(javac 1.7.0_21)和
- Oracle 1.6编译器(javac 1.6.0_37)
两者在第二个示例中都能正常工作。
然而:这是OpenJDK 1.6编译器的一个错误还是Java语言规范中的歧义?