val a = List(1,2,3)
Это эквивалентно:
val a = List.apply[Int](1,2,3)
Тип результата List.apply[Int](...)
является List[Int]
и, следовательно, тип inferencer присваивает этот тип идентификатора для a
. Это происходит во время компиляция. REPL не «обнаруживает» тип во время выполнения.
Это отличается от сопоставления с образцом:
val a: Any = ...
a match {
case list: List[Int] => ...
}
Здесь мы имеем значение a
, для которого у нас нет никакой информации типа. Поэтому мы пытаемся проверить, какой тип он есть, но теперь мы делаем это в runtime. И здесь мы действительно не можем определить точный тип. Самое лучшее, что мы можем сделать здесь, это совпадение с List[_]
.
Подводя итог: Когда вы вводите код в REPL, он сначала скомпилируется в байт-код и затем оценивается. Отображаемая информация типа поступает из фазы компиляции, поэтому она не страдает стиранием типа.