这是一个bug还是特性?以下代码在Java 7中可以正常运行,但在Java 8中会抛出异常:
在Java 8中,最后一条命令会抛出ClassCast异常,所有上面的“等效”命令都以相同的方式工作。
我认为问题在于Java 8中编译器决定在最后一行上使用String.value(char[])而不是像Java 7中那样使用String.value(Object)。我认为这应该为了向后兼容而表现相同。我错过了什么吗?
注意:正如Marko所建议的,这可能与Java 8中引入的目标类型推断有关。
(注:[C是一个字符数组)
两个Java版本都在Windows上:
在Java 8中,最后一条命令会抛出ClassCast异常,所有上面的“等效”命令都以相同的方式工作。
我认为问题在于Java 8中编译器决定在最后一行上使用String.value(char[])而不是像Java 7中那样使用String.value(Object)。我认为这应该为了向后兼容而表现相同。我错过了什么吗?
注意:正如Marko所建议的,这可能与Java 8中引入的目标类型推断有关。
public class Test {
public static void main(String[] args) {
System.out.println( getVal().getClass()); // String
System.out.println( String.valueOf(Test.<Object>getVal()) ); // "abc"
Object obj = getVal();
System.out.println( String.valueOf(obj) ); // "abc"
System.out.println( String.valueOf(getVal()) ); // 7: "abc", 8: Exception
}
// returns a string for simplicity; imagine that given a field, it fetches values from a database
@SuppressWarnings("unchecked")
public static <T> T getVal() {
return (T) "abc";
}
}
Java 7中的结果:
class java.lang.String
abc
abc
abc
Java 8的结果:
class java.lang.String
abc
abc
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to [C
at Test.main(Test.java:11)
(注:[C是一个字符数组)
两个Java版本都在Windows上:
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) Client VM (build 24.45-b08, mixed mode, sharing)
java version "1.8.0_05"
Java(TM) SE Runtime Environment (build 1.8.0_05-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.5-b02, mixed mode)