【问题标题】:How to cast java.lang.Object to a specific type in Scala?如何将 java.lang.Object 转换为 Scala 中的特定类型?
【发布时间】:2012-03-22 03:40:38
【问题描述】:

据我所知,在 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 是行不通的。

【问题讨论】:

    标签: scala casting


    【解决方案1】:

    如果您绝对必须——例如为了与 Java 库兼容——您可以使用以下内容:

    val s: String = o.asInstanceOf[String]
    

    不过,一般来说,asInstanceOf 是一种代码异味,应该避免。

    【讨论】:

    • 似乎工作。是的,我绝对需要这个——为了与 Java 库兼容。谢谢。
    【解决方案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)
    

    【讨论】:

    • 在某些情况下,我觉得这可能有点矫枉过正,而asInstanceOf 很好——例如使用 readObject 反序列化,当您遇到使用预泛型 Java 集合等的库时。我假设这是其中一种情况。
    【解决方案3】:

    为了以后遇到这个问题的人,Travi 之前的回答是正确的,例如可以在 Yamlbeans 中使用,将 Desearialized 对象映射到 Maps,执行以下操作:

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

    我希望这个小评论对我在此处找到的答案的详细信息将来会派上用场。

    【讨论】:

      猜你喜欢
      • 2017-07-15
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 2020-04-23
      • 2020-03-29
      相关资源
      最近更新 更多