gpt4 book ai didi

java - 这真的是扩大与自动装箱吗?

转载 作者:IT老高 更新时间:2023-10-28 21:13:05 25 4
gpt4 key购买 nike

我在 an answer to another question 中看到了这个,引用 Java 规范的缺点:

There are more shortcomings and this is a subtle topic. Check this out:

public class methodOverloading{
public static void hello(Integer x){
System.out.println("Integer");
}

public static void hello(long x){
System.out.println("long");
}

public static void main(String[] args){
int i = 5;
hello(i);
}
}

Here "long" would be printed (haven't checked it myself), because the compiler chooses widening over auto-boxing. Be careful when using auto-boxing or don't use it at all!

我们确定这实际上是一个扩大而不是自动装箱的例子,还是完全是别的东西?

在我最初的扫描中,我同意这样的说法,即输出将是“长”的,因为 i 被声明为原语而不是对象。但是,如果你改变了

hello(long x)

hello(Long x)

输出将打印“整数”

这里到底发生了什么?我对 java 的编译器/字节码解释器一无所知...

最佳答案

在第一种情况下,您的转化率正在扩大。在编译的类上运行“javap”实用程序(包含在 JDK 中)时可以看到这一点:

public static void main(java.lang.String[]);
Code:
0: iconst_ 5
1: istore_ 1
2: iload_ 1
3: i2l
4: invokestatic #6; //Method hello:(J)V
7: return

}

很明显,您会看到 I2L,它是扩展 Integer-To-Long 字节码指令的助记符。见引用 here .

在另一种情况下,将“long x”替换为对象“Long x”签名,您将在 main 方法中拥有以下代码:

public static void main(java.lang.String[]);
Code:
0: iconst_ 5
1: istore_ 1
2: iload_ 1
3: invokestatic #6; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
6: invokestatic #7; //Method hello:(Ljava/lang/Integer;)V
9: return

}

所以你看到编译器已经创建了指令 Integer.valueOf(int),将原语装箱到包装器中。

关于java - 这真的是扩大与自动装箱吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com