这是一个错误或功能吗?以下代码在Java 7中运行正常但在Java 8中引发异常:
最后一个命令在Java8中抛出ClassCast异常,上面的所有"等效"命令的工作方式相同.
我认为问题在于,在Java 8中,编译器决定String.value(char[])在最后一行而不是String.value(Object)在Java 7中使用.我认为这对于向后兼容性应该采用相同的方式.我错过了什么吗?
注意:正如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";
}
}
Run Code Online (Sandbox Code Playgroud)
Java …