如何在 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]
这是我要完成的事情的简化示例。我有一个函数,它根据传递给它的 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]