sách gpt4 ai đã đi

Sự cố so sánh giá trị kỳ lạ trong Kotlin, "===" trả về true nhưng "==" trả về false

In lại 作者:行者123 更新时间:2023-12-04 11:08:26 32 4
mua khóa gpt4 Nike

我在 Kotlin 中遇到了一个非常奇怪的无法解释的值比较问题,以下代码打印

data class Foo (
val a: Byte
)
fun main() {
val NUM: Byte = 1
var m: Foo? = Foo(NUM)
println(m?.a == NUM)
}
但是如果我将最后一行更改为
println(m?.a === NUM)
hoặc
println(m!!.a == NUM)
它打印 真实 ,我很困惑,谁能帮忙解释一下?谢谢。

1 Câu trả lời

该问题仅出现在 1.5.20 版本中,而 1.5.10 版本不受影响。
这似乎是较新的 kotlin 编译器版本中的一个问题。
使用一些字节码,我们可以解释问题( data class 被称为 Blah ,chức năng 被称为 blah ).
这是用 1.5.10 编译的字节码,返回 ĐÚNG VẬYprintln(m?.a == NUM) - 一切似乎都很好。我们正在做两个数字的原始不等于,它返回 SAI (正确,因为 1 != 1 Đúng SAI ).

Compiled from "WtfTest.kt"
public final class de.sfxr.WtfTest {
public de.sfxr.WtfTest();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."":()V
4: return

public final void blah();
Code:
0: iconst_1
1: istore_1
2: new #14 // class de/sfxr/Blah
5: dup
6: iload_1
7: invokespecial #17 // Method de/sfxr/Blah."":(B)V
10: astore_2
11: aload_2
12: astore_3
13: aload_3
14: invokevirtual #21 // Method de/sfxr/Blah.getA:()B
17: iload_1
18: istore_3
19: iload_3
// PRIMITIVE NOT EQUALS => False
20: if_icmpne 27
23: iconst_1
24: goto 28
27: iconst_0
28: istore_3
29: iconst_0
30: istore 4
32: getstatic #27 // Field java/lang/System.out:Ljava/io/PrintStream;
35: iload_3
36: invokevirtual #33 // Method java/io/PrintStream.println:(Z)V
39: return
}
然而在版本 1.5.20 中,字节码指示使用 JVM 进行对象比较 Intrinsics.areEqual盒装 Số nguyên有内容 1和盒装 Byte有内容 1 ,这将返回 SAI , 因为它使用 equalshiện hữu Byte .这就是这个问题的原因。编译器开发人员肯定想要 ĐÚNG VẬY在此刻。
但是为什么这评估为假?这是 Byte.equals 的 fragment 的描述“当且仅当参数不为空 并且是包含与此对象相同的字节值的字节对象 时,结果才为真。”
...以及解释的字节码:
Compiled from "WtfTest.kt"
public final class de.sfxr.WtfTest {
public de.sfxr.WtfTest();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."":()V
4: return

public final void blah();
Code:
0: iconst_1
1: istore_1
2: new #14 // class de/sfxr/Blah
5: dup
6: iload_1
7: invokespecial #17 // Method de/sfxr/Blah."":(B)V
10: astore_2
11: aload_2
12: astore_3
13: aload_3
14: invokevirtual #21 // Method de/sfxr/Blah.getA:()B
17: invokestatic #27 // Method java/lang/Byte.valueOf:(B)Ljava/lang/Byte;
20: iload_1
21: invokestatic #32 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
// OBJECT COMPARISON VIA JVM ON BOXED BYTE(1) AND BOXED INT(1) => False
24: invokestatic #38 // Method kotlin/jvm/internal/Intrinsics.areEqual:(Ljava/lang/Object;Ljava/lang/Object;)Z
27: istore_3
28: iconst_0
29: istore 4
31: getstatic #44 // Field java/lang/System.out:Ljava/io/PrintStream;
34: iload_3
35: invokevirtual #50 // Method java/io/PrintStream.println:(Z)V
38: return
}
làm mới
jetbrains 的小伙伴们评论出票 https://youtrack.jetbrains.com/issue/KT-47717 “这绝对是一个错误。”和优先专业。

关于android - Kotlin 中的奇怪值比较问题, "==="返回 true 但 "=="返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68356051/

32 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com