2015-03-24 3 views

ответ

2

как предполагает @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 примитив в длинный объект, а затем выполнение равных.

4

С 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 имеет .