This question already has an answer here:
kotlin int boxed identity

(1个答案)


2年前关闭。




我是 Kotlin 的初学者。

我不明白下面的输出。
@Test
fun testNumberBoxing() {

    val a:Int = 1000
    val boxedA1: Int? = a
    val boxedA2: Int? = a

    println("first check = ${boxedA1 === boxedA2}")

    val b: Int = 2
    val boxedB1: Int? = b
    val boxedB2: Int? = b

    println("second check = ${boxedB1 === boxedB2}")
}

结果是
first check = true
second check = false

为什么两个输出不同?

我的Kotlin版本是1.2.31
org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.31

最佳答案

我得到的输出

first check = false
second check = true

代码编译成什么
public static final void main(@NotNull String[] args) {
      Intrinsics.checkParameterIsNotNull(args, "args");
      int a = 1000;
      Integer boxedA1 = Integer.valueOf(a);
      Integer boxedA2 = Integer.valueOf(a);
      String var4 = "first check = " + (boxedA1 == boxedA2);
      System.out.println(var4);
      int b = 2;
      Integer boxedB1 = Integer.valueOf(b);
      Integer boxedB2 = Integer.valueOf(b);
      String var7 = "second check = " + (boxedB1 == boxedB2);
      System.out.println(var7);
}

为什么valueOf不一致

为此,我们需要查看valueOf的JavaDoc:



如您所见,对于较小的值,它将在两个调用中返回相同的对象,因此它们是相等的;对于较大的未缓存的值,两个对象是不同的

在Java中,==检查对象是否相等,因此2个相等的对象为false,而同一对象的2个副本返回true。

关于kotlin - Kotlin号码拳击测试很奇怪,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49738117/

10-15 22:04