这很好:
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...
1条答案
按热度按时间nnsrf1az1#
即将发布的scala 3就有了。
从这一节可以看出。