Составляет ли специализация Scala? - PullRequest
5 голосов
/ 08 ноября 2011

У меня сложилось впечатление, что специализация складывается, но в следующем примере это не так:

trait Key [@specialized(Int) A] { 
  def up(k: A): Unit
}

class Test[@specialized(Int) A](key: Key[A], value: A) { 
  key.up(value)
}

Если я дам это в REPL Scala с :javap -v Test, этокажется, что вызов key.up все еще содержит примитив:

public Test(Key, java.lang.Object);
  Code:
   Stack=2, Locals=3, Args_size=3
   0:   aload_0
   1:   aload_1
   2:   putfield    #17; //Field key:LKey;
   5:   aload_0
   6:   aload_2
   7:   putfield    #19; //Field value:Ljava/lang/Object;
   10:  aload_0
   11:  invokespecial   #24; //Method java/lang/Object."<init>":()V
   14:  aload_0
   15:  getfield    #17; //Field key:LKey;
   18:  aload_0
   19:  getfield    #19; //Field value:Ljava/lang/Object;
   22:  invokeinterface #30,  2; //InterfaceMethod Key.up:(Ljava/lang/Object;)V
   27:  return

Так что специализация совершенно бесполезна для разработки универсальных реализаций?В моем случае, структуры данных, это полностью подорвало бы усилия по разработке краткого модульного кода.Надеюсь, я что-то упустил ...

1 Ответ

5 голосов
/ 08 ноября 2011

Вы смотрите на неспециализированную версию класса.

При попытке увидеть другой класс Test$mcI$sp, это специализированная скомпилированная версия. Это своего рода пункт, он должен создать отдельный класс, специализированный для указанного вами примитива.

Редактировать : если вы ищете специализированный класс в REPL, вам нужно получить полное имя класса. По умолчанию REPL обрезает фактический контекст, в котором хранится класс, поэтому вам нужно получить его с помощью println, например:

scala> println(new Test(1).getClass.getName)
$line1.$read$$iw$$iw$Test$mcI$sp

scala> :javap $line1.$read$$iw$$iw$Test$mcI$sp
…
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...