【问题标题】:Scala: Typed method that returns object of the provided TypeScala:返回所提供类型的对象的类型化方法
【发布时间】:2018-10-02 07:15:51
【问题描述】:

大家好,

我需要创建一个带有 Typed 函数的 Typed Class 来解析一个 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] 类型

我可以做些什么来达到要求?

感谢您的帮助。

【问题讨论】:

    标签: scala constructor apply typed


    【解决方案1】:

    为什么不定义一个 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 设为密封特征,并将其作为实现案例类。

    【讨论】:

    • 要补充一点,要求运行时反射通常是一种症状,之前有问题......
    • 谢谢特里。像这样创建隐式 val 是否正确:“implicit val intParser: Parser[IntData] = new IntData(0)” 有没有办法让 parse(s:String) 成为静态成员方法?
    • 谢谢。我创建了一个扩展特征的伴随对象,所以我可以使用“implicit val intParser: Parser[IntData] = IntData”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    相关资源
    最近更新 更多