У меня сложилось впечатление, что специализация складывается, но в следующем примере это не так:
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
Так что специализация совершенно бесполезна для разработки универсальных реализаций?В моем случае, структуры данных, это полностью подорвало бы усилия по разработке краткого модульного кода.Надеюсь, я что-то упустил ...