通用方法调用

2 java generics method-invocation

如果我们有通用方法

class SClass{
    public static <T> ArrayList<T> listFactory(){ return new ArrayList<T>(); }
}
Run Code Online (Sandbox Code Playgroud)

我们可以T在调用此方法时定义type-parameter explicit.

SClass.<?>listFactory();//compile error
SClass.<List<?>>listFactory();//ok
Run Code Online (Sandbox Code Playgroud)

为什么我们不能listFactory用类型参数调用?,但可以用List<?>

Sot*_*lis 5

方法调用规则在Java语言规范中描述.在这种情况下,我们感兴趣

方法调用表达式用于调用类或实例方法.

[...]
TypeName . NonWildTypeArguments Identifier ( ArgumentListopt )
Run Code Online (Sandbox Code Playgroud)

<?>是野生型,<List<?>>不是.

至于原因,请考虑一下

SClass.<?>listFactory();//compile error
Run Code Online (Sandbox Code Playgroud)

还有什么比你即使做<?>listFactory()?不明.你无法做到

new ArrayList<?>(); 
Run Code Online (Sandbox Code Playgroud)

因为JLS禁止它

如果类实例创建表达式中使用的任何类型参数是通配符类型参数(第4.5.1节),则为编译时错误.

但你也不能用它来做任何其他事情.