Учитывая следующий объект:
object Foo {
val bar: List[Int] = List(1, 2, 3)
}
Когда мы компилируем этот файл в байт-код JVM из-за стирания типов и из-за того факта, что Java не поддерживает примитивные типы в качестве параметров для универсальных типов, получаетсяпереведенный в List<Object>
.
Это можно увидеть, скомпилировав и проверив .class
с помощью javap -l
:
public static com.yuvalitzchakov.github.Foo$ MODULE$;
descriptor: Lcom/yuvalitzchakov/github/Foo$;
flags: ACC_PUBLIC, ACC_STATIC
public scala.collection.immutable.List<java.lang.Object> bar();
descriptor: ()Lscala/collection/immutable/List;
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: getfield #19 // Field bar:Lscala/collection/immutable/List;
4: areturn
LineNumberTable:
line 4: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/yuvalitzchakov/github/Foo$;
Signature: #17 // ()Lscala/collection/immutable/List<Ljava/lang/Object;>;
Но, если мы скомпилируем это в файл JAR ипозже возьмите его в качестве зависимости в другом проекте Scala и попытайтесь установить для Foo.bar
другое значение, компилятор Scala выведет этот тип как List[Int]
, а не List[Object]
:
После просмотра файла .class
я не смог найти информацию о параметре type, которая позволила бы компилятору Scala успешно вывести это как List[Int]
.
* 1025.* Где хранятся эти метаданные, чтобы мы могли ссылаться на этот тип как на фактический
List[Int]
вместо
List[Object]
?