将List [Any]中的每个对象都转换为特定类型?

时间:2018-11-09 18:26:03

标签: scala

我有一个POJO对象,它是Map[String, AnyRef]的包装(来自Java)。我想根据地图的键将AnyRef的类型转换为特定的类型。最终目标是使POJO对象返回其自身作为Scala元组的表示形式,最终目标是将其转换为Spark Row。我该怎么办?

不起作用的东西:

case class PojoToTuple(c: JavaObject) extends JavaObject(c) {

    //data: java.util.LinkedHashMap[String, AnyRef] is inherited

    val fields: Seq[Tuple2[String, Class[_]]] = Seq(("name", classOf[String]),
        ("incorporation_date", classOf[java.sql.Date]),
        ... )

    def getScalaRepresentation(): (String, Date, ...) = {
        fields.map{case (s: String, t: Class[_]) => data.get(s).asInstanceOf[t]}
    }
}

[ERROR] path\to\error: error: not found: type t
[ERROR] .map{case (s: String, t: Class[_]) => data.get(s).asInstanceOf[t]}
[ERROR]                                                                ^

我也尝试过

val fields: Seq[Tuple2[String, ???]] = Seq(("name", asInstanceOf[String]),
    ("incorporation_date", asInstanceOf[java.sql.Date]),
    ... )

但是asInstanceOf是抽象类Any的成员,因此我不知道如何将其提取为任何类型的第一类对象。

有什么想法吗?


可行的替代方法是写

case class PojoToTuple(c: JavaObject) extends JavaObject(c) {

    //data: java.util.LinkedHashMap[String, AnyRef] is inherited

    val fields = Seq("name", "incorporation_date", ...)

    def getSparkRepresentation(): (String, Date, ...) = {
        (data.get("name").asInstanceOf[String],
            data.get("incorporation_date").asInstanceOf[java.sql.Date],
            ...
        )

我想获得一个版本,不必将字段名列表硬编码两次。我不喜欢这样做的另一个原因是,我想重载getSparkRepresentation()函数以也接受字段名列表,以获取所有字段的子集。使用硬编码版本没有一个很好的方法。

0 个答案:

没有答案