Type mismatch creating Scala Array/Seq of Generic type

Viewed 84

I have the following generic classes

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
  }
}

When I am trying to create Seq of generic objects and pass like below I am getting this error.

Am I doing something wrong here 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("*")))
0 Answers
Related