Scala:返回所提供类型的对象的类型化方法

时间:2018-10-02 07:15:51

标签: scala constructor apply typed

大家好,

我需要创建一个具有Typed函数的Typed类,以解析Array [String]并返回Array [OutputType]

class Data()
class IntData(var element: Int) extends Data
class BoolData(var element: Boolean) extends Data

class ArrayParser[OutputType <: Data]() {
    def parse(in: Array[String]): Array[OutputType] = {
        in.map(s => parseRecord(s))
    }
}

我尝试过:

    def parse(in: Array[String]): Array[OutputType] = {
        in.map(s => {
            import scala.reflect.runtime.universe._
            if (typeOf[OutputType] =:= typeOf[IntData])
                new IntData(s.toInt)
            else
                new BoolData(s.toBoolean)
        })
    }

但出现错误: Array [Data]类型的表达与预期的Array [OutputType]

类型不一致

我该怎么做才能达到要求?

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

为什么不定义Typeclass来将字符串解析为相关类型?

trait Parser[T <: Data] { 
  def parse(s: String): T
}

implicit val intParser: Parser[IntData] = ???
implicit val boolParser: Parser[BoolData] = ???

def parse[T <: Data : Parser](a: Array[String]): Array[T] = { 
  val p = implicitly[Parser[T]]
  a.map(s => p.parse(s))
}

我还建议使Data成为密封的特征及其实现案例类。