У меня есть следующие обобщенные c классы
import org.apache.spark.sql.Row
import org.apache.spark.sql.functions.udf
import collection.immutable.Seq
import org.apache.spark.sql.Column
abstract class UserFilter[A]() extends Serializable {
def test(column: A): Boolean
def ApllyMultipleFilter(filters: collection.immutable.Seq[UserFilter[A]]) = udf[Boolean,Row]((x: Row) => {
....
})
}
class AppVersionGE(filterCriteria: String) extends UserFilter[String] {
true
}
}
class LevelGE(filterCriteria: Int) extends UserFilter[Int]() {
override def test(column: Int): Boolean = {
true
}
}
Когда я пытаюсь создать Seq из обобщенных c объектов и передать, как показано ниже, я получаю эту ошибку.
Я что-то здесь не так делаю filters: collection.immutable.Seq[UserFilter[A]]
?
import collection.immutable.Seq
import org.apache.spark.sql.functions.{array, count, lit, struct, sum, to_json, when}
val filterApp = new AppVersionGE("2.5.1")
val filterLevel = new LevelGE(30)
val userFilters = collection.immutable.Seq(filterApp,filterLevel)
val filteredDf = udfDf.withColumn("new_column", userFilters(0).ApllyMultipleFilter(userFilters)(struct("*")))
command-14702873:13: error: type mismatch;
found : scala.collection.immutable.Seq[UserFilter[_ >: Int with String]]
required: scala.collection.immutable.Seq[UserFilter[_40(in value filteredDf)]] where type _40(in value filteredDf) >: Int with String
val filteredDf = udfDf.withColumn(AB_FLAG, userFilters(0).ApllyMultipleFilter(userFilters)(struct("*")))