我有一个接口(interface)A
,类B
实现了它。
下面的泛型方法有效
public static <T, U extends T> List<T> listFactory(Collection<U> source) {
return new ArrayList<T>(source);
}
但是
public static <T> List<T> listFactory(Collection<? extends T> source) {
return new ArrayList<T>(source);
}
没有(编译错误,类型不匹配),当我将输出定向到
List<A> tester = listFactory(B.defaultCollectionFactory(3));
defaultCollectionFactory(int count)
静态提供 B
的集合,具有默认的标签方案。
关于这是为什么的任何见解?通用 U 和通配符似乎在做同样的事情。
最佳答案
编译器正在为 listFactory
推断不同类型的参数方法超出您的预期。它推断T
类型是 B
, 所以签名实际上是 List<B> listFactory(Collection<? extends B> source)
.指定类型参数 A
通过在方法调用中显式:
List<A> tester = Test.<A> listFactory(B.defaultCollectionFactory(3));
关于Java 泛型的好奇心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1514548/