سكالا الطريقة العامة أقل المرجل

0

كيف يمكنني منع بعض تكرار الكود لطريقة عامة في سكالا؟ تم تجميع الكود الخاص بي فقط عندما كانت معلمة النوع مرتبطة بالسمة وليس بالطريقة.

كما ترى ، أكرر حاليًا معلمات النوع التي يتم تمريرها إلى السمة و 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

بشكل عام ، لا يستنتج سكالا حجج النوع للطرق. ومع ذلك ، في قضيتك ، يمكنك بالفعل استخدام بنية لامدا (الموجزة تمامًا) ، منذ ذلك الحين MyTrait في المثال الخاص بك هو نوع "SAM" (طريقة مجردة واحدة):

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

الآن يتم استنتاج أنواع الحجج بشكل جيد.

تحفظات:

  • ConcreteProvider هو الآن val بدلا من object . بالنسبة للعديد من الأغراض (الأكثر؟) ، هذا لن يهم.
  • لا يمكن تحديد ذلك في المستوى الأعلى ، لذلك قد تضطر إلى وضعه في package object .
  • سيفشل هذا إذا قمت بإضافة طريقة مجردة أخرى MyTrait .
:مؤلف
فوق
قائمة طعام