Как привести java.lang.Object к определенному типу в Scala? - PullRequest
19 голосов
/ 22 марта 2012

Насколько я знаю, в Java я могу

Object o = new String("abc")
String s = (String) o

Но как переписать его в Scala?

val o: java.lang.Object = new java.lang.String("abc")
val s: String = // ??

Библиотека Java, которую я хочу использовать, возвращает java.lang.Objectкоторый мне нужно привести к более конкретному типу (также определенному в этой библиотеке).Пример Java делает это точно так же, как мой первый пример, но просто использование Scala source: TargetType вместо Java (TargetType)source не работает.

Ответы [ 3 ]

26 голосов
/ 22 марта 2012

Если вам абсолютно необходимо - например, для совместимости с библиотекой Java - вы можете использовать следующее:

val s: String = o.asInstanceOf[String]

В целом, однако, asInstanceOf являетсяЗапах кода и следует избегать.

11 голосов
/ 22 марта 2012

Вот безопасный способ сделать это:

val o: java.lang.Object = new java.lang.String("abc")
o match { case s: String => /* do stuff with s */ }

Если вам нужно вернуть результат, это также работает:

import PartialFunction._
def onlyString(v: Any): Option[String] = condOpt(v) { case x: String => x }
val s: Option[String] /* it might not be a String! */ = onlyString(o)
5 голосов
/ 30 июня 2012

Ради будущих людей, имеющих эту проблему, предыдущий ответ Трави является правильным и может быть использован, например, в Yamlbeans для отображения Десериализованных объектов на Карты, делая что-то вроде:

val s: java.util.Map[String,String] = obj.asInstanceOf[java.util.Map[String,String]]

Надеюсь, этот небольшой комментарий пригодится в будущем как подробность ответа, который я нашел здесь.

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