【发布时间】:2014-02-11 01:10:24
【问题描述】:
说,我有一个方法:
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()(必须说,这在当时对我来说是一个相当大的启示)并且一切都可以顺利编译,但是当您有一些复杂的类型真的很麻烦。
我只是想知道这是否是某种错误,或者是否有任何正当理由让它以这种方式工作?
【问题讨论】:
-
能否改写标题?
-
谈论锅叫水壶黑色。 Collections.emptyList() 返回一个不可修改的列表,所以代码无论如何都不会工作。
-
@Kayaman 题外话,正如 OP 指出的那样。问题是关于推理的原则,运行时并没有考虑到它。
-
@MarkoTopolnik 我知道问题是什么,不要再光顾我了。我要指出的是,他在抱怨“迟钝”的类型推断时写了一个“迟钝”的例子。
-
@Kayaman 你在光顾 OP,这让你公平游戏。
标签: java generics type-inference