簡體   English   中英

不帶任何一個的聯合通用類型 Scala

[英]Union generic type without Either Scala

這工作正常:

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|BB <: A|B ,這Either沒有實現。

另一個極端,我可以這樣做,但是類型太松了:

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

更新2
為什么我不想要Either

(原因 2)

返回的結果實際上是SparkDataset ,它需要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...

即將發布的 Scala 3 有它。

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

這個 Scastie session中可以看出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM