Java 泛型的好奇心

标签 java generics collections bounded-wildcard

我有一个接口(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/

相关文章:

java - 不可变集和图的JDK9随机化

java - 将整数集转换为 int[] 数组时出现问题

java - 如何外部化 web.xml servlet init-param?用于 Servlet 的 Spring DelegatingFilterProxy?

java - Hbase Java API连接错误

代码片段的 Java 泛型说明

java - 是否可以创建一个在运行时反射(reflect)类的 List<class> ?

c# - ReSharper:空检查始终是错误警告

JavaScript 集合 API?

java - 为什么在 Java EE 中使用 CDI

java - Jersey JAX-RS : Specifying/* as base URL pattern