异常的通用语法:数组 asList(...)
使用泛型类时,通常必须指定type参数(例如String
):
ArrayList<String> list = new ArrayList<String> ;
使用泛型方法时,通常不会传递类型参数:
public static <T> void foo(T param) { }
...
String s = ...;
MyClass.foo(s);
您会注意到,没有代码在哪里明确指定我们想要的String
版本foo
,即没有<String>
像使用通用类(List<String>
)时那样指定明确的类型实参。
编译器正在做一些编译器魔术,以根据上下文推断泛型类型参数。这是一件伟大的事情,非常强大。
但是,有时编译器无法自动推断类型参数:
public static <T> void bar { T myLocalVar = ...; ... }
MyClass.bar ;
bar
我们尝试调用什么具体的版本,即此调用的类型参数是什么?不知道?好吧,编译器也没有。我们必须明确声明类型参数,就像我们通常使用泛型类时那样:
MyClass.<String>bar ;
另请参阅:
- http://www.angelikalanger.com/GenericsFAQ/FAQSections/ParameterizedMethods.html#FAQ002
- 那里还有许多其他好东西 http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html
除了: 值得一提的是,Java 7将添加所谓的菱形运算符,以使我们现在也可以让编译器在使用泛型类时推断类型参数:
ArrayList<String> list = new ArrayList<String> ;
变成
ArrayList<String> list = new ArrayList<> ;
Java 7中的菱形运算符(<>)有什么意义?
解决方法
我发现了“不寻常”的通用语法,例如:
Arrays.<String>asList(...);
Collections.<String>emptyList ;
显然,这些方法的结果是通用的。这样的语法用于类型检查吗?一个Object
阵列不能为一个参数Arrays.<String>asList(...)
。
你可能想看: