1

这工作正常:

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 = ???

是否有可能拥有泛型类型AB联合类型?干杯。


更新1

Either是一个选项但并不理想,因为它在处理返回的结果时需要模式匹配。实际上,我想要这个:A <: A|B, B <: A|BEither但没有实现。

另一个极端,我可以这样做,但是类型太松了:

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

UPDATE2
为什么我不想要Either

(原因 2)

返回的结果实际上是 a Datasetof 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...
4

1 回答 1

2

即将发布的 Scala 3 拥有它。

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

从这个 Scastie 会议中可以看出。

于 2021-03-07T21:26:51.147 回答