为什么Java的类型推断如此弱?

时间:2014-01-21 12:27:59

标签: java generics type-inference

说,我有一个方法:

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()(必须说,这对我来说当时是一个很大的启示)并让所有内容顺利编译,但是当你有一些复杂的类型,那真的是一个麻烦。

我只是想知道这是不是某种错误,还是有任何正当理由让它以这种方式运作?

3 个答案:

答案 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中,它会被照顾。