Почему скалярная коробка Int? - PullRequest
0 голосов
/ 14 мая 2018

Я написал следующий очень простой тест:

import scala.collection.immutable.HashSet

class Test {
  def m() = {
    var s = new HashSet[Int]
    s = s + 1
  }
}

И выяснил, что он компилируется в этот код:

public class Test {
  public void m();
    Code:
       0: new           #12                 // class scala/collection/immutable/HashSet
       3: dup
       4: invokespecial #15                 // Method scala/collection/immutable/HashSet."<init>":()V
       7: astore_1
       8: aload_1
       9: iconst_1
      10: invokestatic  #21                 // Method scala/runtime/BoxesRunTime.boxToInteger:(I)Ljava/lang/Integer;
      13: invokevirtual #25                 // Method scala/collection/immutable/HashSet.$plus:(Ljava/lang/Object;)Lscala/collection/immutable/HashSet;
      16: astore_1
      17: return

  public Test();
    Code:
       0: aload_0
       1: invokespecial #30                 // Method java/lang/Object."<init>":()V
       4: return
}

Как видите, 1 упакован перед созданием нового неизменного набора с 1 элементом. Почему это в штучной упаковке. Int extends AnyVal, а не AnyRef.

1 Ответ

0 голосов
/ 14 мая 2018

Точно, Int extends AnyVal, а не AnyRef.Но неизменный HashSet[A] имеет A в качестве параметра, который не специализирован для примитивных типов , то есть это не @specialized(Int) A или что-то подобное, поэтому он можетиметь дело только со ссылочными типами, которые расширяют AnyRef, примитивные типы должны быть в штучной упаковке.К счастью, это скрыто компилятором Scala.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...