我的程序是
package stackoverflow;
public class Main {
public static void main(String[] args) {
String.valueOf(hoge());
}
static <E> E hoge() {
return (E) "hoge";
}
}
结果是
Exception in thread "main" java.lang.ClassCastException:
java.base/java.lang.String cannot be cast to [C
at stackoverflow.Main.main(Main.java:6)
我正在使用Java9。
hoge
的返回类型不明确。我想应该是编译错误。
为什么编译器选择String.valueOf(char[])
而不是String.valueOf(Object)
?
最佳答案
有几个重载的 String.valueOf,其中只有两个具有对象参数 valueOf(char[]) 和 valueOf(Object),其他都是原始类型,如 String.valueOf(int)。由于确切的返回类型未知,但它是对象类型,因此编译器选择了 valueOf(char[])。我不知道 JLS 的哪一部分解释了这种行为,但它与此类似:
public static void main(String[] args) {
x(null);
}
static void x(char[] x) {
System.out.println("char[]");
}
static void x(Object o) {
System.out.println("Object");
}
编译器选择char[]
关于java - 为什么这个程序会抛出ClassCastException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49828126/