【发布时间】:2017-06-04 07:59:13
【问题描述】:
我的代码使用 JDK 7 编译失败,但使用 JDK 8 编译成功。
抽象实际代码:
interface A {
...
}
class B implements A {
...
}
public void AAA(List<A> list) {...}
AAA(Collections.singletonList(new B()));
Collections.singletonList 定义为
public static <T> List<T> singletonList(T o) {
return new SingletonList<>(o);
}
据我所知,基于泛型,T 将被推断为 B,因此 Collections.singletonList(new B()) 将是无法分配给 List 的 List,因为 Java 泛型是不变的。
但是在 JDK 8 中,T 被推断为 A 并且编译成功。
我想知道如何将 T 推断为 A,因为这里有两个变量用于类型 T:A 和 B。
有优先顺序吗?还是编译器找到共同的祖先类?
附上官方文档更感谢!
提前致谢!
ps1。 JDK 7的版本是Oracle 1.7.0_79,JDK 8的版本是Oracle 1.8.0_66。
ps2。以下是实际代码的链接:
【问题讨论】:
标签: java generics java-8 type-inference