Ответ 1
Если у вас есть необходимость для совместимости с библиотекой Java, например, вы можете использовать следующее:
val s: String = o.asInstanceOf[String]
В общем случае asInstanceOf
является запахом кода и его следует избегать.
Насколько я знаю, на 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
не работает.
Если у вас есть необходимость для совместимости с библиотекой Java, например, вы можете использовать следующее:
val s: String = o.asInstanceOf[String]
В общем случае asInstanceOf
является запахом кода и его следует избегать.
Здесь безопасный способ сделать это:
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)
Для будущих людей, имеющих эту проблему, предыдущий ответ Travi правилен и может использоваться, например, в Yamlbeans для сопоставления Desearialized объектов с Картами, которые делают что-то вроде:
val s: java.util.Map[String,String] = obj.asInstanceOf[java.util.Map[String,String]]
Я надеюсь, что этот небольшой комментарий будет полезен для будущего в будущем как деталь по поводу ответа, который я нашел здесь.