Подтвердить что ты не робот

Как применить java.lang.Object к определенному типу в Scala?

Насколько я знаю, на 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 Я хочу использовать return java.lang.Object, который мне нужно применить к более конкретному типу (также определенному в этой библиотеке). Пример Java делает это точно так же, как мой первый пример, но использование Scala source: TargetType вместо Java (TargetType)source не работает.

4b9b3361

Ответ 1

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

val s: String = o.asInstanceOf[String]

В общем случае asInstanceOf является запахом кода и его следует избегать.

Ответ 2

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

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)

Ответ 3

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

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

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