Java 8中使用三元运算符导致泛型编译错误,但在Java 7中没有。

6 浏览
0 Comments

Java 8中使用三元运算符导致泛型编译错误,但在Java 7中没有。

这个类在Java 7中可以编译通过,但在Java 8中不能通过:

public class Foo {
    public static void main(String[] args) throws Exception {
        // 在Java 7和Java 8中都可以编译通过:
        Class aClass = true ? String.class : StringBuilder.class;
        CharSequence foo = foo(aClass);
        // 将变量内联,可以在Java 7中编译通过,但在Java 8中不能通过:
        CharSequence foo2 = foo(true ? String.class : StringBuilder.class);
    }
    static  T foo(Class clazz) throws Exception {
        return clazz.newInstance();
    }
}

编译错误:

错误:(9, 29) java: 无法将类Foo中的方法foo应用于给定的类型;
   需要:java.lang.Class
   找到:true ? Str[...]class
   原因:推断类型不符合等式约束
     推断:java.lang.StringBuilder
     等式约束:java.lang.StringBuilder,java.lang.String

为什么在Java 8中停止工作?这是故意的/是某个其他功能的副作用,还是简单的编译器错误?

0