为什么我们不能使用类型参数调用 listFactory?,但可以使用 List?
实例创建在类实例创建表达式中,如果类型是参数化类型,则所有类型参数都不能是通配符。我认为它是一样的:
List<?> list = new ArrayList<?>(); // compile-time error
只有实例创建中的顶级参数才禁止包含通配符。允许使用嵌套通配符。因此,以下内容是合法的:
List<List<?>> lists = new ArrayList<List<?>>(); // ok
这是一个原因:
SClass.<List<?>>listFactory();//ok
来自 Java 泛型和集合
泛型方法调用如果泛型方法调用包括显式类型参数,则这些类型参数不能是通配符。
class SClass{
public static <T> ArrayList<T> listFactory(){ return new ArrayList<T>(); }
}
您可以选择要推断的类型参数,也可以传递显式类型参数。以下两种都是合法的:
List<?> list = Lists.factory();
List<?> list = Lists.<Object>factory();
如果传递了显式类型参数,则它不能是通配符:
List<?> list = Lists.<?>factory(); // compile-time error
允许嵌套通配符:
List<List<?>> = Lists.<List<?>>factory(); // ok
Java 设计者考虑到每个通配符类型都是一些普通类型的简写,因此他们认为最终每个对象都应该使用普通类型创建。目前尚不清楚这种限制是否有必要,但不太可能成为问题。