2013-06-06 2 views
3

Я только начал расследование Scala и нашел следующую цитату запутанной в Wikipedia page on Scala:в Scala «очистить» типа стирания

[Scala] очищает [...] бедные дизайнерские решения в Java (например, Тип стирание ...

Я думал, тип стирание было ограничением, налагаемое на виртуальной машине Java, поэтому, учитывая, что JVM выполняет Scala код, то как это было «очищено»?

Я ценю что дизайнер Scala также вносит свой вклад d для JVM, поэтому мне любопытно понять, добавляет ли он/команда Scala компилятор Scala для переноса информации типа времени выполнения и, таким образом, стирания типа «очистка». Это так?

Заранее благодарим за любую информацию, которую вы можете предоставить.

ответ

4

Scala, к сожалению, все еще имеет дело с стиранием типа во время выполнения в JVM. Тем не менее, несколько вещей, которые были очищены относительно дженерик:

  • Параметров типа не являются факультативными (не List, только List<String>/List[String])
  • Языковой поддержки для совместных/контрвариаций

Кроме того, для ограничения ограничений JVM TypeTags (в 2.9 Manifests) можно использовать для хранения информации о типе, которая в противном случае была бы потеряна во время выполнения. Например:

import scala.reflect.runtime.universe._ 

def foo[T : TypeTag](x: List[T]) = { 
    println(implicitly[TypeTag[T]].tpe) 
} 

Это печатает тип элементов списка. Что-то, что было бы безвозвратно потеряно, если, например, вы пропустили пустой список:

foo(List.empty[String]) 
// not distinguishable without TypeTags from 
foo(List.empty[Int]) 
+0

Большое спасибо за эти идеи! Этот ответ лаконичен и освещен. – EdwardGarson

1

Ну, цитата говорит, что «очищает», а не «устраняет». Тип стирания все еще существует, и он может вас укусить.

Scala имеет Manifest s. Manifest - объект, содержащий информацию о вашем текущем типе. Here is a nice answer около Manifest s.