说,我有一个方法:
public static <T> Collection<T> addToCollection(T element, Collection<T> collection) {
collection.add(element);
return collection;
}
然后在尝试编译此代码时:
Integer i = 42;
Collection<Integer> result = addToCollection(i, Collections.emptyList());
我收到错误Type mismatch: cannot convert from Collection<Object> to Collection<Integer>
。
任何人都可以解释为什么类型系统无法推断Collections.emptyList()应该是Collection<Integer>
类型的?
上面的例子显然是非常人为的,但我总是偶然发现这个限制而且非常烦人。阅读 Effective Java 之后,我发现你可以简单地做Collections.<Integer>emptyList()
(必须说,这对我来说当时是一个很大的启示)并让所有内容顺利编译,但是当你有一些复杂的类型,那真的是一个麻烦。
我只是想知道这是不是某种错误,还是有任何正当理由让它以这种方式运作?
答案 0 :(得分:11)
在Java 8中改进了类型推断系统,引入了target typing,以便为流和lambda提供更多的表达能力。因此,您的代码将使用Java 8进行编译。
有关updated tutorial的更多信息,页面底部有一个非常类似的例子。
答案 1 :(得分:0)
Collections.emptyList()
会返回通过List<Object>
方法传递的addToCollection()
。由于Object不是Integer,因此失败。
答案 2 :(得分:0)
这样做有什么害处?
Integer i = 42;
List<Integer> emptyList = Collections.emptyList();
Collection<Integer> result = addToCollection(i, emptyList);
在java 8中,它会被照顾。