gpt4 book ai didi

scala - (Number, Number) 匹配 (Float, Int) 但不匹配 (Int, Float)

转载 作者:行者123 更新时间:2023-12-01 23:26:06 25 4
gpt4 key购买 nike

这是 Scala 2.8.0 中的错误吗? (同样发生在 2.8.1.RC2 上)

import junit.framework._import Assert._class BugTest extends TestCase {  def compare(first: Any, second: Any): Int = {      (first, second) match {        case (k: Int, o: Int) => k compare o        //why the next case matches (Float, Int) but does not match (Int, Float) ???        case (k: Number, o: Number) => k.doubleValue() compare o.doubleValue()        case _ => throw new Exception("Unsupported compare " + first + "; " + second)    }  }  def testCompare() {    assertEquals("Both Int", -1, compare(0, 1))    assertEquals("Both Float", 1, compare(1.0, 0.0))    assertEquals("Float then Int", 0, compare(10.0, 10))    assertEquals("Int then Float", 0, compare(10, 10.0))//this fails with an exception  }}

最佳答案

我认为这是一个错误。如果您查看生成的字节码:


public int compare(java.lang.Object, java.lang.Object);
Code:
Stack=4, Locals=7, Args_size=3
0: aload_1
1: astore_3
2: aload_2
3: astore 4
5: aload_3
6: instanceof #8; //class java/lang/Integer
9: ifeq 81
12: aload_3
13: invokestatic #14; //Method scala/runtime/BoxesRunTime.unboxToInt:(Ljava/lang/Object;)I
16: istore 5
18: aload 4
20: instanceof #8; //class java/lang/Integer
23: ifeq 45
26: getstatic #20; //Field scala/Predef$.MODULE$:Lscala/Predef$;
29: iload 5
31: invokevirtual #24; //Method scala/Predef$.intWrapper:(I)Lscala/runtime/RichInt;
34: aload 4
36: invokestatic #14; //Method scala/runtime/BoxesRunTime.unboxToInt:(Ljava/lang/Object;)I
39: invokevirtual #29; //Method scala/runtime/RichInt.compare:(I)I
42: goto 124
45: new #31; //class java/lang/Exception

//part omitted for brevity..

81: aload_3
82: instanceof #54; //class java/lang/Number
85: ifeq 161
88: aload_3
89: checkcast #54; //class java/lang/Number
92: astore 6
94: aload 4
96: instanceof #54; //class java/lang/Number
99: ifeq 125
102: getstatic #20; //Field scala/Predef$.MODULE$:Lscala/Predef$;
105: aload 6
107: invokevirtual #58; //Method java/lang/Number.doubleValue:()D
110: invokevirtual #62; //Method scala/Predef$.doubleWrapper:(D)Lscala/runtime/RichDouble;
113: aload 4
115: checkcast #54; //class java/lang/Number
118: invokevirtual #58; //Method java/lang/Number.doubleValue:()D

在第 6 行,检查第一个变量是否是 java.lang.Integer 的实例。如果这不成功,我们将在第 81 行继续,该行以 java.lang.Number 检查开始。如果第一个变量是一个整数,那么我们继续对第二个变量进行相同的检查。但是,如果第二次检查不成功,则不会再次在第 81 行继续进行 Number 检查,而是跳转到第 45 行,这将引发异常。这似乎不正确。我快速浏览了 trac 但无法直接找到关于此 的问题,因此创建一个 可能是明智的。

编辑正如 Extempore 所指出的,这是一个已经存在于 trac 中的错误,请参阅下面他的评论。

关于scala - (Number, Number) 匹配 (Float, Int) 但不匹配 (Int, Float),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3915866/

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