不带任何Scala的联合泛型类型
这很好:不带任何Scala的联合泛型类型,scala,apache-spark,generics,union-types,apache-spark-encoders,Scala,Apache Spark,Generics,Union Types,Apache Spark Encoders,这很好: 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 或者都是一个选项,但并不理想,因为在处理返回的结果时需要模式匹配。实际上,我想要的是:A很快就会发布,Scala 3已经有了它 de
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
或者
都是一个选项,但并不理想,因为在处理返回的结果时需要模式匹配。实际上,我想要的是:A很快就会发布,Scala 3已经有了它
def echo[A, B](a: A, b: B): A|B = ??? //this compiles
可以看出,
嗯,听起来像C++的函数特化会很方便。here@smac89谢谢你,很高兴知道。但它似乎只适用于特定类型,这意味着它不能执行def echo[@specialized(A,B)AB](A:A,B:B,AB:AB)=?
(其中A
和B
是泛型)。其次,它似乎无法返回一个@specialized
类型,例如def echo[a,B](a:a,B:B):@specialized(a,B)=???
这两个错误@迪玛,谢谢或者
都不错,但在处理返回结果时需要模式匹配。实际上,我希望这样:联合类型还需要模式匹配。感谢您的帮助。在Scala2.11中,它仍然没有编译,有没有办法做到这一点?
def echo[A, B](a: A, b: B): Dataset[A|B] = ???
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...
def echo[A, B](a: A, b: B): A|B = ??? //this compiles