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.toString());
    }
}

请尽可能详细地解释这一点。提前感谢大家。

最佳答案

这是一个Java language featureboxing它允许原始类型与引用类型参数、变量或集合一起使用。编译器将生成正确的代码以在您的情况下获取1 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.valueOf(double) 的调用,该调用用于实际获取必要的对象。

1 使用单词“obtain”代替“construct”,因为对象可能会被缓存。由于不变性,这不是问题。

关于java - 为什么原始类型可以转换为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25878180/

相关文章:

java - 如何在构造函数上使用 lombok 的 @Tolerate

java - 使用离线 gradle 运行标准 java 项目时出现 Android Studio 错误

java - 如何在 Spring 中交替 HttpEntity 和 ModelAndView 之间的 Web Controller 响应

java - GWT 更改包结构,无法找到 gwt.xml

java - 从 WSDL 到 Java 对象 - 自动生成?

java - 检查两个字符串是否是变位词

java - JDBC - java.sql.SQLException : ORA-00933: SQL command not properly ended

java - 如何使用拆分函数将字符串拆分为 '\'?

java - 从 java 打开文件编辑器

java - fragment 中的字节数组参数为空