Приведение значений из Any с использованием ClassManifest в Scala - PullRequest
3 голосов
/ 07 декабря 2010

У меня есть List[Any] значений и список соответствующих ClassManifest[_] с сохранением исходных типов значений. Как преобразовать какое-либо значение из списка обратно в его исходный тип?

def cast[T](x: Any, mf: ClassManifest[T]): T = x.asInstanceOf[T] не работает.

Спасибо за ваши ответы.

Ответы [ 2 ]

3 голосов
/ 07 декабря 2010

Это не может сработать, поскольку тип возвращаемого значения cast всегда будет приниматься как самый высокий общий супертип из всех, к которым T ограничен.Нет никакого способа сделать это более конкретным во время компиляции.

Если вы пытаетесь создать строго типизированную коллекцию разнородных типов, то вам действительно нужен HList:

http://jnordenberg.blogspot.com/2008/09/hlist-in-scala-revisited-or-scala.html

0 голосов
/ 07 декабря 2010

Способ использования экземпляра Class в Java / Scala для приведения объекта заключается в использовании метода Class.cast.Поэтому вы можете подумать, что могли бы сделать:

mf.erasure.cast(x) //T

Но это не сработает, потому что mf.erasure - это Class[_] (или Class<?> в Java), поэтому приведение не имеет смысла (то естьне предлагает никакой дополнительной информации).Это (конечно) один из недостатков в использовании непроизведенных дженериков.

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