【发布时间】:2013-03-15 15:07:04
【问题描述】:
为什么编译器能够在函数返回类型的情况下正确推断出String 类型参数。
public class Generics {
private static List<String> function() {
return new ArrayList<>();
}
}
但是当要推断的类型是方法参数时它会失败:
public class Generics {
public static void main(String[] args) {
method(new ArrayList<>());
}
private static void method(List<String> list) {
}
}
这种情况下的错误是:
The method method(List<String>) in the type Generics is not applicable
for the arguments (ArrayList<Object>)
【问题讨论】:
-
因为他们不会在可能的情况下实现泛型类型推断。我没有测试过这个特定的案例,但是 Java 8 在类型推断方面带来了很多改进,以帮助使用 lambda。
-
这是因为完美的类型推断是一个在有限时间内难以解决的问题(它与停机问题的复杂度相同)。因此,Java 开发人员不得不在某处划清界限。正如其他人所指出的那样,他们不断地把这条线推得更远,但必须存在一些限制。
-
@KonstantinNaryshkin:在 Java 8 上所做的工作表明他们很早就划清了界限。更多有用的规则是可能的,并且正在被集成在 Java 8 中。说他们应该在第一次进一步推动它很容易,但很难预测哪些额外的工作有实际的好处。总而言之,最初的实现非常有用。但它本来可以更早改进的。
标签: java generics type-inference