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
也不起作用。 有没有办法做到这一点?如果是这样,怎么样?
谢谢!
答案 0 :(得分:1)
从Java互操作性回来后,Scala会将Object
解释为AnyRef
。由于Int
不是AnyRef
的子类型,因此模式匹配器不会让您做“愚蠢”的事情。
您只需将Any
的结果归为get
即可强制解释为: Any
:
val one = genericRecord.get("hello"): Any