Учитывая следующий объект:
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
я не смог найти информацию о параметре типа, который позволил бы компилятору Scala успешно вывести это как List[Int]
.
Где хранятся эти метаданные, чтобы мы могли ссылаться на этот тип как на фактический List[Int]
вместо List[Object]
?
javap
не понимает и, следовательно, не печатает. - person Holger   schedule 21.11.2018