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看看这个: