我刚学习了泛型编程,List<E>界面ArrayList,所以我可以理解下面的陈述.
ArrayList<String> list = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)
但我不明白我在浏览网页时看到的下一个陈述.
List<String> list2 = Collections.<String>emptyList();
Run Code Online (Sandbox Code Playgroud)
Collections?为什么不是Collections<E>还是Collections<String>?<String>放在方法名称之前emptyList?(emptyList<String>()Generic 不正确吗?)
说,我有一个方法:
public static <T> Collection<T> addToCollection(T element, Collection<T> collection) {
collection.add(element);
return collection;
}
Run Code Online (Sandbox Code Playgroud)
然后在尝试编译此代码时:
Integer i = 42;
Collection<Integer> result = addToCollection(i, Collections.emptyList());
Run Code Online (Sandbox Code Playgroud)
我收到一个错误Type mismatch: cannot convert from Collection<Object> to Collection<Integer>.任何人都可以解释为什么类型系统无法推断Collections.emptyList()应该是类型Collection<Integer>?
上面的例子显然是非常人为的,但我一直偶然发现这个限制,这真的很烦人.在阅读了Effective Java之后,我发现你可以简单地做Collections.<Integer>emptyList()(必须说,那对我来说这是一个很好的启示)并且让所有东西都能顺利编译,但是当你有一些复杂的类型时,那真的是令人讨厌的.
我只是想知道这是不是某种错误,还是有任何正当理由让它以这种方式工作?