这工作正常:
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 = ???
UPDATE2
为什么我不想要Either
?
(原因 2)
返回的结果实际上是 a Dataset
of Spark,这需要Encoder
任何不是子类型的类型Product
(请参阅本主题)。
多次调用此方法时,最终会出现太多的Either
相互包装,例如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...