斯卡拉通用方法少样板

时间:2018-06-19 21:12:59

标签: scala generics

如何防止Scala中的通用方法重复执行某些代码?我的代码仅在将类型参数绑定到特征而不是方法时才编译。

您可以看到,我目前重复传递给trait和mehtod的类型参数。

trait MyTrait[T <: Product, C <: OtherTrait] {

  def provide(spark: SparkSession, c: C): Dataset[T]
}

object ConcreteProvider
  extends MyTrait[MyCaseClass, MyCaseClassConfiguration] {
    override def provide(
        spark: SparkSession,
        c: MyCaseClassConfiguration): Dataset[MyCaseClass] = {
        spark.sql(s"SELECT field1, field2 FROM ${c.mydb}.${c.mytable}")
          .as[MyCaseClass]
    }
  }

1 个答案:

答案 0 :(得分:0)

通常,Scala不会为方法推断类型参数。但是,根据您的情况,您实际上可以使用(非常简洁的)lambda语法,因为示例中的MyTrait是“ SAM”(单一抽象方法)类型:

val ConcreteProvider: MyTrait[MyCaseClass, MyCaseClassConfiguration] =
    (spark, c) => spark.sql("SELECT ...").as[MyCaseClass]

现在可以很好地推断出您的参数类型。

注意事项:

  • ConcreteProvider现在是val而不是object。对于许多(大多数?)目的,这都没有关系。
  • 这不能在顶层定义,因此您可能必须将其放在package object中。
  • 如果您向MyTrait添加另一个抽象方法,则此操作将失败。