Создание несоответствия типов при создании типа Scala Array / Seq of Generi c - PullRequest
3 голосов
/ 17 марта 2020

У меня есть следующие обобщенные 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("*")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...