【问题标题】:Scala: unpacking an Object: how do I know the typeScala:解包对象:我怎么知道类型
【发布时间】:2015-01-08 17:22:20
【问题描述】:

Apache Avro GenericRecord.get(colName) 做了(脏?)返回对象的技巧,因此它可以返回它想要的任何类型。 Object 包含其他类型:String、Int、Date 等。值可以为 null。

例子:

val one = genericRecord.get("hello")     // "hello" resolves to an Int
val two = genericRecord.get("goodbye")   // "goodbye" resolves to a String

"one" 和 "two" 是 Object 类型,但它们“实际上”分别是 Int 和 String。

我正在尝试编写一个隐式类方法来返回带有结果的 Option(<actual_type>)(以避免处理 null 情况),所以我可以编写

val myVal = genericRecord.getWithType("hello")

并让 myVal 为 Option[Int] 类型。

尝试了以下方法:

one match { 
    case i: Int => Option(i.asInstanceOf[Int])
    case s: String => Option(s.toString)
}

但我明白了

error: pattern type is incompatible with expected type;
  found   : Int
  required: Object
       case x: Int =>
               ^

匹配上

one.getClass 

也不行。 有没有办法做到这一点?如果是这样,怎么做?

谢谢!

【问题讨论】:

  • 您可以使用 GenericData.Record.getSchema 找出“真正的”数据库类型。
  • 您可能需要匹配java.lang.Integer(扩展Object)而不是Int

标签: class scala implicit


【解决方案1】:

当从 Java 互操作性返回时,Scala 将 Object 解释为 AnyRef。由于Int 不是AnyRef 的子类型,模式匹配器不会让你做“愚蠢”的事情。

您可以通过将get 的结果赋予: Any 来强制解释为Any

val one = genericRecord.get("hello"): Any

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    相关资源
    最近更新 更多