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

说,我有一个方法:

public static  Collection addToCollection(T element, Collection collection) { collection.add(element); return collection; } 

然后在尝试编译此代码时:

 Integer i = 42; Collection result = addToCollection(i, Collections.emptyList()); 

我收到错误Type mismatch: cannot convert from Collection to Collection 。 任何人都可以解释为什么类型系统无法推断Collections.emptyList()应该是Collection类型?

上面的例子显然是非常人为的,但我一直偶然发现这个限制,这真的很烦人。 在阅读了Effective Java之后,我发现你可以简单地进行Collections.emptyList() (必须说,那对我来说这是一个很好的启示)并且所有内容都能顺利编译,但是当你有一些复杂的类型时那真是令人讨厌。

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

类型推断系统在Java 8中得到了改进,引入了目标类型 ,以便为流和lambda提供更多的表达能力。 因此,您的代码将使用Java 8进行编译。

在更新的教程中有更多关于它的信息 ,在页面的最底部有一个非常类似的例子。

Collections.emptyList()返回一个List ,它通过addToCollection()方法传递。 而且由于Object不是Integer,因此失败了。

这样做有什么害处?

 Integer i = 42; List emptyList = Collections.emptyList(); Collection result = addToCollection(i, emptyList); 

在Java 8中,它将被小心。