2016-10-25 14 views
0

Предположим, что существует класс X. В какой-то момент в моем коде я получаю o типа Object, и я хочу явно передать его X. Обычно я бы сделал val x: X = o.asInstanceOf[X]. Однако X не в объеме, все у меня есть экземпляр X «s из Class, например, так:Выполнение явного приведения на основе экземпляра `Class`

  1. проходит classOf[X] к моей функции в качестве аргумента называется classOfX.
  2. В пределах моей функции, я хотел бы сделать val x: X = o.asInstanceOf[classOfX].

Есть ли способ сделать это в Скала?

+1

Возможный дубликат http://stackoverflow.com/questions/40220804/scala-cast-to-a-variable-type – pamu

+0

Это не дубликат. Функция в записи, которую вы связали, является общей, а моя нет. Как описано выше, аргумент типа «X» не существует, но аргумент типа «Class» называется 'classOfX'. – lambdarookie

ответ

2

Только вид. java.lang.Class имеет метод cast, который позволяет вам нарисовать Class[A] до A. Вы могли бы написать метод, как это:

def cast[A](o: Any, clazz: Class[A]): A = clazz.cast(o) 

scala> cast("abc", classOf[String]) 
res10: String = abc 

Это будет «работать» для большинства классов, но не для Scala штучных примитивов:

scala> cast(1, classOf[Int]) 
java.lang.ClassCastException: Cannot cast java.lang.Integer to int 

И, конечно же, литье работает только по модулю типа стирания, так это не будет немедленно сгенерирует исключение:

scala> val a = List("a").getClass 
a: Class[_ <: List[String]] = class scala.collection.immutable.$colon$colon 

scala> cast(List(1), a) 
res16: List[String] = List(1) 

на верху, он также будет работать с классами, полученные во время выполнения с помощью getClass, как выше.

Недостатком является то, что вам следует избегать кастинга любой ценой из-за того, насколько он подвержен ошибкам, сделает код. Он выдает систему безопасности из окна. Редко каждый должен оказаться в ситуации, когда у них есть объект, где они не знают, что это такое, но могут каким-то образом сообщить компилятору, что он использует classOf. Вполне вероятно, что использование какой-либо формы дженериков может устранить проблему кастинга, но невозможно сказать без кода.