为什么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中,它将被小心。