Разве это не должно называть равных позади сцены?Почему Scala's == отличается в случае Int?
scala> 1 equals 1l
res2: Boolean = false
scala> 1 == 1l
res3: Boolean = true
Разве это не должно называть равных позади сцены?Почему Scala's == отличается в случае Int?
scala> 1 equals 1l
res2: Boolean = false
scala> 1 == 1l
res3: Boolean = true
как предполагает @MichaelLang, this ответ может помочь вам, конкретно:
сравнения двух примитивов (в штучной упаковке или без упаковки) с == всегда должны дать результат, который вы получили бы, сравнивая эти значения как unboxed примитивов. Когда вы вызываете equals напрямую, вы пропускаете все, что размягчая логику, и вместо этого относитесь к теории java о том, что значения в двух коробках разных типов всегда неравны.
Если проанализировать байткод:
1 == 1л производит
0: aload_0
1: invokespecial #19 // Method java/lang/Object."<init>":()V
4: aload_0
5: putstatic #21 // Field MODULE$:L;
8: aload_0
9: iconst_1
10: putfield #17 // Field res0:Z
13: return
непосредственно сравнивает значения обоих примитивных 1-х, но если вы исследуете:
1 равен 1l, а затем
0: aload_0
1: invokespecial #19 // Method java/lang/Object."<init>":()V
4: aload_0
5: putstatic #21 // Field MODULE$:L;
8: aload_0
9: iconst_1
10: invokestatic #27 // Method scala/runtime/BoxesRunTime.boxToInteger:(I)Ljava/lang/Integer;
13: lconst_1
14: invokestatic #31 // Method scala/runtime/BoxesRunTime.boxToLong:(J)Ljava/lang/Long;
17: invokevirtual #35 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
20: putfield #17 // Field res0:Z
23: return
Где вы можете видеть, что это бокс 1l примитив в длинный объект, а затем выполнение равных.
С Programming in Scala 2nd Edition, глава 11
1 Единственные случаи, когда == является не непосредственно вызывать равно как для штучной числовых классов Java, такие как Integer или Long. В Java новый Integer (1) не равен новому Long (1), хотя для примитивных значений 1 == 1L. Начиная с Scala является более регулярным языком, чем Java, было необходимо исправить это несоответствие специальным способом == для этих классов. Аналогичным образом, метод ## предоставляет версию хэширования Scala, которая равна так же, как и хэш-код Java, за исключением полевых числовых типов, где работает последовательно с ==. Например, новый Integer (1) и новый Длинный (1) хэш-код тот же, что и ##, хотя их хэш-код Java имеет .
Нет, он должен поступать правильно. – sschaef