如何在 Scala 中处理返回泛型对象的函数

How to deal with functions returning objects with generic type in Scala

这是我要完成的事情的简化示例。我有一个函数,它根据传递给它的 Field 对象的类型生成不同签名的 HashMap。我不确定处理此问题的最佳方法是什么。任何帮助表示赞赏。

trait Field
case class IntField extends Field {
    def convert(x: String): Int = x.toInt
}
case class StringField extends Field {
    def convert(x: String): String = x
}
case class DoubleField etc...

def someFunc(field: Field): HashMap[?, Int] = {
    val index = new HashMap[?, Int]() // This needs to be [String, Int] or [Int, Int] or [Double, Int]

    val data = // some data from csv file that will be parsed

    for (line <- data) {
        val values = field.convert(data) // can return String or Int or Double
        index.put(values, 0)       
    }
    index
}

您应该能够通过向 Field 特征添加类型参数来实现此目的(我添加了 HashMap 导入并将数据显式设置为“123”以便能够在 REPL 中对此进行测试):

trait Field[A] {
    def convert(x: String): A // Need to define convert for the trait, too.
}
case class IntField extends Field[Int] {
    def convert(x: String): Int = x.toInt
}
case class StringField extends Field[String] {
    def convert(x: String): String = x
}
//case class DoubleField etc...

import scala.collection.mutable.HashMap
def someFunc[A](field: Field[A]): HashMap[A, Int] = {
    val index = new HashMap[A, Int]() // This needs to be [String, Int] or [Int, Int] or [Double, Int]

    val data = "123"// some data from csv file that will be parsed

    for (line <- data) {
        val values = field.convert(data) // can return String or Int or Double
        index.put(values, 0)
    }
    index
}

现在对 someFunc 的调用将确定传入字段的类型并生成适当类型的 HashMap 输出:

scala> someFunc(IntField())
res1: scala.collection.mutable.HashMap[Int,Int] = Map(123 -> 0)

scala> :t res1
scala.collection.mutable.HashMap[Int,Int]

scala> someFunc(StringField())
res2: scala.collection.mutable.HashMap[String,Int] = Map(123 -> 0)

scala> :t res2
scala.collection.mutable.HashMap[String,Int]