问题描述
这很好用:
def echo[A,B](a: A,b: B): A = ???
这也很好:
def echo[A,b: B): B = ???
但是,我们如何实现返回类型 A 或 B?
// error
def echo[A,b: B): A|B = ???
是否可以简单地拥有通用类型A和B的联合类型? 干杯。
更新1
Either
是一个选项,但并不理想,因为它在处理返回结果时需要模式匹配。实际上,我想要这个:A <: A|B
,B <: A|B
,Either
没有实现。
另一个极端,我可以这样做,但是类型太松了:
def echo[A,b: B): Any = ???
更新2
为什么我不想要 Either
?
(原因 2)
返回的结果实际上是 Spark 的 Dataset
,对于不是 Encoder
的子类型的任何类型都需要 Product
(参见 {{ 3}}).
多次调用此方法时,会以过多的 Either
相互包裹而告终,例如Either[Either[Either[...]]]
。这需要定义太多的编码器。
所以我实际上是这样做的:
def echo[A,b: B): Dataset[A|B] = ???
如果我这样做,由于 Either
类型,它需要有许多不同的编码器:
def echo[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,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,Pig]]
// if we keep iterating,then too many encoders to define...