union泛型类型,没有scala

ymzxtsji  于 2021-07-12  发布在  Spark
关注(0)|答案(1)|浏览(323)

这很好:

def echo[A, B](a: A, b: B): A = ???

这也很好:

def echo[A, B](a: A, b: B): B = ???

但是,我们如何实现这一点,以返回类型a或b?

// error
def echo[A, B](a: A, b: B): A|B = ???

有可能有一个泛型类型a和b的联合类型吗?干杯。
更新1 Either 是一个选项,但并不理想,因为处理返回结果时需要模式匹配。实际上,我想要这个: A <: A|B , B <: A|B ,其中 Either 无法实现。
另一个极端,我可以这样做,但类型太宽松:

def echo[A, B](a: A, b: B): Any = ???

更新2
为什么我不想 Either ?
(原因2)
返回的结果实际上是 Dataset Spark,这需要 Encoder 对于不是的子类型的任何类型 Product (参见本主题)。
当多次调用此方法时,结果是 Either 互相 Package ,例如。 Either[Either[Either[...]]] . 这需要定义太多的编码器。
所以我实际上是这样做的:

def echo[A, B](a: A, b: B): Dataset[A|B] = ???

如果我这样做,它将需要有许多不同的编码器,由于 Either 类型:

def echo[A, B](a: A, b: B): Dataset[Either[A, B]] = ???
val result1: Either[Cat, Dog] = echo(a: Cat, b: Dog)
val result2: Either[Either[Cat, Dog], Pig] = echo(result1: Either[Cat, Dog], c: Pig)

// we have to define encoders:
implicit encoder1: org.apache.spark.sql.Encoders.kryo[Either[Cat, Dog]]
implicit encoder2: org.apache.spark.sql.Encoders.kryo[Either[Either[Cat, Dog], Pig]]

// if we keep iterating, then too many encoders to define...
nnsrf1az

nnsrf1az1#

即将发布的scala 3就有了。

def echo[A, B](a: A, b: B): A|B = ???  //this compiles

从这一节可以看出。

相关问题