gpt4 book ai didi

Kotlin Char compareTo 失败

转载 作者:IT老高 更新时间:2023-10-28 13:38:03 27 4
gpt4 key购买 nike

我在 Kotlin 中有以下代码片段:

val pair: Pair<Char,Char> = 'z' to 'z'
val comparison = pair.first.compareTo(pair.second)
println(comparison)

当我尝试运行它时,它在第二行失败并出现以下异常:

java.lang.ClassCastException: java.lang.Character cannot be cast to java.lang.Number

IDE (IntelliJ) 不会提示任何错误的类型。这个问题在某种程度上与 Chars 来自 Pair<Char, Char> 的事实有关。因为'z'.compareTo('z')工作正常。你知道 Kotlin 是如何解决以下调用的吗?

我使用的是 Kotlin 1.0.4

最佳答案

TL;DR显然,这是一个编译器错误。

这种行为的原因在于 Kotlin 编译器为这两个调用生成的字节码。 (如果你使用 IntelliJ IDEA,你可以使用 the bytecode viewing tool 检查字节码)。

首先,'z'.compareTo('z')调用生成的字节码是:

LINENUMBER 10 L3
BIPUSH 122
BIPUSH 122
INVOKESTATIC kotlin/jvm/internal/Intrinsics.compare (II)I

它调用 kotlin.jvm.internal.Intrisics.compare()比较两个Ints,Chars作为Ints(BIPUSH意味着将字节作为整数推送)。

但是如果你查看 pair.first.compareTo(pair.second) 的字节码,你会发现类似这样的内容:

ALOAD 1
INVOKEVIRTUAL kotlin/Pair.getFirst ()Ljava/lang/Object;
CHECKCAST java/lang/Number
INVOKEVIRTUAL java/lang/Number.intValue ()I

ALOAD 1
INVOKEVIRTUAL kotlin/Pair.getSecond ()Ljava/lang/Object;
CHECKCAST java/lang/Number
INVOKEVIRTUAL java/lang/Number.intValue ()I

INVOKESTATIC kotlin/jvm/internal/Intrinsics.compare (II)I

它也调用 kotlin.jvm.internal.Intrisics.compare,但这是它之前尝试做的事情:

  • 从对中获取组件(ALOAD 1INVOKEVIRTUAL ... 行)
  • 检查对象是否可以转换为 Number (CHECKCAST ...)
  • java.lang.Number.intValue() (INVOKEVIRTUAL ...)

第二行和第三行是罪魁祸首,Char不是Number。看起来编译器为此比较生成了不正确的字节码(对于 Number 类型是正确的,似乎 Char 只是没有单独处理)。

an issue about this在 Kotlin 问题跟踪器中,它可能会在未来的版本中得到修复。


要暂时修复代码中的调用,您可以在调用之前手动转换 Char:

pair.first.toInt().compareTo(pair.second.toInt())

关于Kotlin Char compareTo 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40962892/

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