Java 为何可以将基元类型强制转换为对象

Java 为何可以将基元类型强制转换为对象,java,Java,我想知道这段代码为什么和如何工作。 基元类型不是扩展对象,为什么这样做 public class Main { public static void main(String[] args) { double rndValue = 232; showObj(rndValue); } public static void showObj(Object obj) { System.out.printf(obj.toStri

我想知道这段代码为什么和如何工作。 基元类型不是扩展对象,为什么这样做

public class Main
{
    public static void main(String[] args) {
        double rndValue = 232;
        showObj(rndValue);
    }
    public static void showObj(Object obj)
    {
        System.out.printf(obj.toString());
    }
}
请尽可能详细地解释这一点。先谢谢大家

这是一个调用,允许基元类型使用引用类型参数、变量或集合。编译器将生成适当的代码,以在您的案例中获得java.lang.Integer

拆解说明了这一点:

public static void main(java.lang.String[]);
    Code:
       0: ldc2_w        #2                  // double 232.0d
       3: dstore_1
       4: dload_1
       5: invokestatic  #4                  // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
       8: invokestatic  #5                  // Method showObj:(Ljava/lang/Object;)V
      11: return
在指令5中,编译器生成对Double.valueOfdouble的调用,该调用用于实际获取必要的对象


1由于对象可能被缓存,因此使用“获取”一词代替“构造”。由于不变性,这不是问题。

它将int转换为对象。这个过程被称为。

这里有两件事在进行——一个是装箱转换双精度到双精度,一个是引用加宽转换双精度到对象。当调用showObj并将rndValue分配给obj时,将进行分配转换,并且在装箱转换之后,引用加宽转换是明确允许的:

分配上下文允许使用以下内容之一:

身份转换§5.1.1

a扩大原语转换§5.1.2

拓宽参考转换§5.1.5

装箱转换§5.1.7(可选)之后是加宽参考转换

取消装箱转换§5.1.8(可选)之后是加宽原语转换

emphasis mine

看看这个: