Только вид. 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
. Вполне вероятно, что использование какой-либо формы дженериков может устранить проблему кастинга, но невозможно сказать без кода.
Возможный дубликат http://stackoverflow.com/questions/40220804/scala-cast-to-a-variable-type – pamu
Это не дубликат. Функция в записи, которую вы связали, является общей, а моя нет. Как описано выше, аргумент типа «X» не существует, но аргумент типа «Class» называется 'classOfX'. – lambdarookie