java - 为什么这个程序会抛出ClassCastException?

标签 java

我的程序是

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/

相关文章:

java - 获取触发事件的类 - Java

java - 将 MapDotMarkers 与 JMapViewer 结合使用

java - 空指针异常逐行读取文件

java - Centos mysql 连接器 java - JDBC 驱动程序

java - 为什么我的 log4j2 属性配置不记录到控制台或单独的文件?

java - 如何创建具有两个键(键对、值)的 HashMap?

java - 使用错误管理在 Java 中运行多线程

JavaFX如何从其他Stage(类)访问字段(TextArea)

java - 创建一个 Map<String,List<Integer>>

java - 自定义 JpaRepository 过滤器或查询