如何防止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]
}
}
答案 0 :(得分:0)
通常,Scala不会为方法推断类型参数。但是,根据您的情况,您实际上可以使用(非常简洁的)lambda语法,因为示例中的MyTrait
是“ SAM”(单一抽象方法)类型:
val ConcreteProvider: MyTrait[MyCaseClass, MyCaseClassConfiguration] =
(spark, c) => spark.sql("SELECT ...").as[MyCaseClass]
现在可以很好地推断出您的参数类型。
注意事项:
ConcreteProvider
现在是val
而不是object
。对于许多(大多数?)目的,这都没有关系。package object
中。MyTrait
添加另一个抽象方法,则此操作将失败。