Scala:解压缩一个Object:我怎么知道这个类型

时间:2014-11-12 00:23:58

标签: class scala implicit

Apache Avro GenericRecord.get(colName)做了返回Object的(脏?)技巧,因此它可以返回它想要的任何类型。 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

"一个"和"两个"属于Object类型,但它们实际上是#34;分别是Int和String。

我试图编写一个隐式类方法来返回带有结果的Option(<actual_type&gt;)(以避免处理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 

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

谢谢!

1 个答案:

答案 0 :(得分:1)

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

您只需将Any的结果归为get即可强制解释为: Any

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