我有以下设置:

public class SomeUtil {

    public static void doSmth(boolean b) {
        System.out.println("boolean");
    }

    public static void doSmth(String b) {
        System.out.println("string");
    }

    public static void doSmth(Object b) {
        System.out.println("object");
    }
}
public interface SomeCl {
    <T> T getAttribute(Object var1);
}
public class SomeClImpl implements SomeCl {
    @Override
    public <T> T getAttribute(Object var1) {
        Boolean o = Boolean.TRUE;
        return (T)o;
    }
}
public class Demo {
    public static void main(String[] args) {
        SomeCl someCl = new SomeClImpl();
        SomeUtil.doSmth(someCl.getAttribute(Boolean.TRUE));
    }
}

当我运行Main方法时,执行失败,并引发ClassCastException:

线程"main"中的异常:在Demo2.main(Demo2.java:4)中,无法将类java.lang.Boolean转换为类java.lang.String(java.lang.Boolean和java.lang.String在加载器‘bootstrap’的模块java.base中)

所以问题是:为什么JVM试图将布尔值转换为字符串?为什么不反对呢?

附注:请不要建议我在调用someCl.getAttribute(arg)个方法之前手动强制转换它,或者像调用someCl.</</DesiredType/>/>getAttribute(arg)那样调用它

推荐答案

由于choosing the most specific method的语言规则,Java编译器 Select 调用doSmth(String b)而不是doSmth(Object b).

编译器不知道您传递给doSmth的参数的类型,该参数具有泛型返回类型,因此它 Select 最具体的方法.

Java相关问答推荐

屏蔽字母数字代码的Java正则表达式

JUnit—如何模拟局部变量对象方法调用

有没有一种方法使保持活动设置专用于java.net.http.HttpClient的一个实例

流迭代列表<;对象>;上的NoSuchElementException

所有 case 一起输入时输出错误,而单独放置时输出正确

在运行MVN测试时,为什么构建失败,并显示了java.lang.ClassNotFoundException:java.net.http.HttpResponse?

Spring Boot Maven包

JPanel透支重叠的JComcoBox

SonarLint:只能有条件地调用方法(S)

如何将Pane的图像快照保存为BMP?

使用正则表达式从字符串中提取多个值

有没有可能在时间范围内得到多种解决方案?

深度优先搜索实现:算法只向右搜索

使用for循环时出现堆栈溢出错误,但如果使用if块执行相同的操作,则不会产生错误

记录是类的语法糖吗?

获取所有可以处理Invent.ACTION_MEDIA_BUTTON Android 13 API33的Android包

Java类型推断:为什么要编译它?

如何在Struts2中使用操作类中的结果注释重定向到不同的命名空间

为什么Instant没有从UTC转换为PostgreSQL的时区?

始终使用Spring Boot连接mongodb上的测试数据库