scala - Scala 中如何处理返回泛型类型对象的函数

标签 scala generics typeclass static-typing

这是我想要完成的事情的简化示例。我有一个函数,可以根据传递给它的 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 的调用将确定传入 Field 的类型并生成适当类型的 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]

关于scala - Scala 中如何处理返回泛型类型对象的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32150007/

相关文章:

java - Scala 中 Java 8 Supplier 接口(interface)的等价物

scala - 是否有可能实现(在 Scala 中)自动实现包装类方法的多态包装类?

c# - 这个设计是个好主意吗——接口(interface)和抽象类

java - 泛型 - 下限/上限通配符行为?

haskell - 如何重新包装类型类实例

haskell - 将函数与 Haskell 中的类型相关联

scala - 如何合并左两个列表?

Scala - 类型不匹配;找到 Int,需要 String

generics - 我可以在 Rust 中使这个断言通用吗?

haskell - 这种类型的签名发生了什么? (Haskell 中的 Vector.Mutable 修饰符)