Почему я не могу создать массив универсального типа? - PullRequest
9 голосов
/ 22 мая 2011

Это не работает:

def giveArray[T](elem:T):Array[T] = {
    new Array[T](1)
  }

Но это так:

  def giveList[T](elem:T):List[T] = {
    List.empty[T]
  }

Я уверен, что это довольно простая вещь, и я знаю, что массивы могут вести себя немного необычно в Scala.

Может ли кто-нибудь объяснить мне, как создать такой массив, а также почему он вообще не работает?

1 Ответ

18 голосов
/ 22 мая 2011

Это связано с стиранием типа JVM. Манифест был введен для обработки этого, они приводят к тому, что информация о типе должна быть присоединена к типу T. Это скомпилирует:

def giveArray[T: Manifest](elem:T):Array[T] = {
  new Array[T](1)
}

Есть почти дублированные вопросы по этому вопросу. Дай мне посмотреть, смогу ли я выкопать. Для получения дополнительной информации см. http://www.scala -lang.org / documents / files / collection-api / collection_38.html . Я цитирую (в вашем случае замените EvenElems на Elem)

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

В частности, вы также можете использовать ClassManifest.

def giveArray[T: ClassManifest](elem:T):Array[T] = {
  new Array[T](1)
}

Похожие вопросы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...