Забудьте мой комментарий, я перечитал ваш вопрос и заметил простую проблему.
Здесь override def get[TGWR]
вы не говорите, что этот класс создает экземпляры TGWR
, но вы создаете новый параметр типа имени TGWR
, который будет скрывать ваш реальный тип.
Я исправил его с помощью следующего кода:
import org.apache.spark.sql.{SparkSession, Dataset}
abstract class WR extends Product with Serializable
final case class TGWR(a: String, b: String) extends WR
abstract class W[T <: WR] {
def get(): Dataset[T]
}
final class TGW(spark: SparkSession) extends W[TGWR] {
override def get(): Dataset[TGWR] = {
import spark.implicits._
Seq(TGWR("dd","dd")).toDF().as[TGWR]
}
}
Что вы можете использовать прямо так:
val spark = SparkSession.builder.master("local[*]").getOrCreate()
(new TGW(spark)).get()
// res1: org.apache.spark.sql.Dataset[TGWR] = [a: string, b: string]
res1.show()
// +---+---+
// | a| b|
// +---+---+
// | dd| dd|
// +---+---+
Надеюсь, это то, что вы ищете.
Не сомневайтесь, попросите разъяснений.