【发布时间】:2014-03-19 14:46:02
【问题描述】:
这个类在 Java 7 中可以编译,但在 Java 8 中不行:
public class Foo {
public static void main(String[] args) throws Exception {
//compiles fine in Java 7 and Java 8:
Class<? extends CharSequence> aClass = true ? String.class : StringBuilder.class;
CharSequence foo = foo(aClass);
//Inlining the variable, compiles in Java 7, but not in Java 8:
CharSequence foo2 = foo(true ? String.class : StringBuilder.class);
}
static <T> T foo(Class<T> clazz) throws Exception {
return clazz.newInstance();
}
}
编译错误:
错误:(9, 29) java: 类 Foo 中的方法 foo 不能应用于给定 类型;必需:java.lang.Class 找到:真? Str[...]类
原因:推断类型不符合等式约束 推断:java.lang.StringBuilder 等式约束:java.lang.StringBuilder,java.lang.String
为什么这在 Java 8 中停止工作了?它是故意的/其他功能的副作用,还是仅仅是编译器错误?
【问题讨论】:
-
这是因为它改进了类型推断。
-
@berry120 你认为这是一种改进吗? :)
-
通过这个例子,我明白了你试图更清楚地表达的观点 - 我同意,在我看来,三元运算符并没有以应有的方式推断类型。
-
@AleksanderBlomskøld 答案有了一些进展。您可能想要查看。
-
您使用的是什么 IDE?这在带有 Java 8 的新 Eclipse 上运行良好。