【发布时间】:2018-06-19 21:12:59
【问题描述】:
如何防止 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]
}
}
【问题讨论】:
-
你还需要绑定
MyCaseClass、MyCaseClassConfiguration和CellFeedSubscriberConfiguration,所以不知道你担心什么重复。您没有显示参数c在provide()中的使用方式。您应该能够将provide的主体分解为provideHelper并在特征中定义provide。 -
我编辑了示例以显示
c的用法。 -
什么意思,我还需要绑定?我认为你在
[T]中引用我的类型参数应该没问题? -
确实如此。重命名
-
另请注意,您的代码可能容易受到 SQL 注入的攻击。您可能应该使用更高级别的 SQL API。对于 Spark,请参阅:stackoverflow.com/questions/41941472/…