【发布时间】:2017-04-09 14:00:43
【问题描述】:
为什么以下代码在 Java 8 中无法编译。 我知道类型推断是这里的罪魁祸首,但我想解释一下。
public class TypeInferenceProblem {
class ATest<E extends B>
{
private E find(C<? extends E> CObj)
{
return null;
}
public void findCs(List<? extends C<? extends E>> cList)
{
find(new C());// This compiles fine
for (C cObj : cList)
{
E cachedEntity = find(cObj); // This cause error in java 8 but works fine in java 7
}
}
}
class B{
}
class C <T> {
}
}
【问题讨论】:
-
我在 Java 7 中遇到与 Java 8 相同的错误。请自行查看:Java 8 exploding 和 Java 7 exploding
-
当不涉及 lambdas(并且不能,应该是 Java 7 代码)时,您为什么要调用该类
LambdaTypeInferenceProblem? -
@Bohemian:这不是证明。之前已经注意到,Ideone 总是使用 Java 8 编译器,即使它声称使用 Java 7。你甚至可以在那里使用 lambda 表达式。
-
当您将raw type
C传递给find时,您基本上是在禁用泛型,因此,不能指望E会被返回。我认为,这个应该也被以前的版本拒绝了,这是一个错误,它不是。 -
@Bohemian:见lambda expression in Java 7...
标签: java java-8 type-inference