IntelliJ Idea 调试器的评估器在比较 Scala Long 和 Float 变量时给出与正常程序不同的结果

xin*_*ong 6 java scala intellij-idea

在此输入图像描述

正如屏幕截图所示,当我将相同的文字值与 Float 和 Long 类型进行比较时,Scala 表示它不相等

但评估者却说他们是平等的!

我怀疑这是 Intellij Idea 中的一个错误,因为相同的代码在正常的 Scala 运行时中会产生与评估器运行时不同的结果。

如果评估者的结果不可信,这可能会给开发者带来麻烦。

我想知道我的想法是否有问题,希望有人指出。

Ali*_*iel 2

我无法使用 Intellij 评估器重现您的示例(尽管我不使用 Mac,这可能是 Mac 版本 Intellij 上的错误),但我可以说 Java 和 Scala 对此的处理方式有所不同。实际上,在 Scala 2.13.x 中这些值是相等的。

Java 根据代码的类型(原始类型与包装类型)以不同的方式处理此代码:

    long vl = 32294629407L;
    float vf = 32294629407f;
    Boolean res11 = vl == vf;
    System.out.println(res11); // true

    Long vl1 = 32294629407L;
    Float vf1 = 32294629407f;
    Boolean res22 = vl1.equals(vf1);
    System.out.println(res22); // false
Run Code Online (Sandbox Code Playgroud)

由于 Scala 被设计为一种更常规的语言,因此通过对==这些类的方法进行特殊封装,从语言中消除了这种差异:

  val vl: Long  = 32294629407L
  val vf: Float = 32294629407f
  val res11     = vl == vf // true 

  println(res11) // true
Run Code Online (Sandbox Code Playgroud)

== 不直接调用的唯一情况equals是 Java 的装箱数字类型。

笔记

对于 Scala 的早期版本,这并不成立,因为在 Scala 2.12 中这似乎是无效的。