不带任何 Scala 的联合泛型类型

如何解决不带任何 Scala 的联合泛型类型

这很好用:

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

是否可以简单地拥有通用类型AB联合类型? 干杯。


更新1

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

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

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

更新2
为什么我不想要 Either

(原因 2)

返回的结果实际上是 SparkDataset,对于不是 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...

解决方法

即将发布的 Scala 3 拥有它。

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

this Scastie session中所示。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?