2014-01-19 2 views
0

Я знал, что такое стирание. поэтому, я думаю, scala REPL не может точно определить общий тип.
Как я уже говорил выше, не может Scala обнаружить общий типа сравнения с шаблоном, как это:
Как работают дженерики в scala REPL?

case list: List[Int] 

Но когда я объявляю значение типа List, обнаруживает, что Scala общего типа содержится.

scala> val a = List(1,2,3) 
    a: List[Int] = List(1, 2, 3) 

Как это возможно?

ответ

3
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, он сначала скомпилируется в байт-код и затем оценивается. Отображаемая информация типа поступает из фазы компиляции, поэтому она не страдает стиранием типа.

1

Когда вы пишете:

val a = List(1,2,3) 

Scala использует определение типа, чтобы найти ближайший тип соответствия во время компиляции. По сути, это будет переписать его для вас, как:

val a: List[Int] = ... 

Он будет использовать эту информацию для типа параметра времени компиляции типа проверки коды и удалить его после этого, так что вы получите List[_] в вашей программе. Это связано с тем, что JVM работает таким образом - стирает тип.

Когда вы сопоставляете шаблон по списку во время выполнения, информация о типе стирается, поэтому любой List будет соответствовать. Компилятор Scala предупредит вас во время компиляции об этом.

Это работает аналогично в REPL и в обычном цикле компиляции->.

 Смежные вопросы

  • Нет связанных вопросов^_^