如何在 Kotlin 中表达联合类型?

Ben*_*ten 11 kotlin union-types sum-type

联合类型(也称为求和类型)是一种强大的语言功能,我发现自己经常在 TypeScript 中使用它

\n

大致如下:

\n
let a: string | number = \xe2\x80\x9chello\xe2\x80\x9d\na = 3\n
Run Code Online (Sandbox Code Playgroud)\n

我如何在 kotlin 中实现这种类型的行为?

\n

我看到一些人谈论使用继承和密封类来完成此任务,但看起来如果您想将这种方法与基元(例如 String 和 Int)一起使用,那么就必须围绕这些类型编写包装器来访问底层值。

\n

我想知道是否有更务实的解决方案。

\n

Ale*_*nov 10

Kotlin 问题跟踪器中存在一个问题:可表示的并集和交集类型(它还包含一些先前讨论的链接)。团队的最新更新是

Roman Elizarov 于 2021 年 11 月 19 日 18:14 评论了
此问题的简短更新。这是一个有趣且重要的特性,但是以向后兼容且务实的方式集成到语言中确实很难。当我们发布新的 K2 编译器时,我们将开始全面研究它,我们团队中最好的编译器工程师将能够开始研究它。


Jus*_*ing 3

据我所知,在 kotlin 中并没有真正的“漂亮”方法来实现这一点,实现可以保存字符串和整数的变量的一种方法可能如下所示:

var x: Any = 5
x = "hello"
Run Code Online (Sandbox Code Playgroud)

但正如您所注意到的,X 不仅可以保存字符串和整数,而且可以使用 Arrow 库中的“Either”类(如果我没记错的话),它允许这种行为:

var x = Either<Int, String>(5)
Run Code Online (Sandbox Code Playgroud)

不管怎样,我不太确定为什么你需要这样一个变量

  • “Either”是另一个 monad,因此主要用于以函数方式编写代码。典型的用例可能是当预期返回值(此处为 Int)的计算失败时,在方法中返回错误消息。它绕过了类型转换,无论是否智能(在第一种情况下,这对于任何有意义的事情都是必需的)。 (4认同)
  • 两者看起来都是一个不错的解决方案,不幸的是我正在寻找更多本机联合类型支持,尽管我认为找不到。上面只是一个示例,但实际上我正在构建 DSL,并且在使用 lambda 重载函数调用时遇到一些问题。所以我希望我可以返回多种类型,而不是重载。 (2认同)