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

11

联合类型,也被称为求和类型,是一种强大的语言特性,在TypeScript中我经常使用它们。

大致意思如下:

let a: string | number = “hello”
a = 3

我该如何在Kotlin中实现这种行为?

我看到一些人谈论使用继承和密封类来实现这个目标,但似乎如果想要对原始类型(例如String和Int)使用这种方法,那么就必须编写包装器来访问底层值。

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


在 Kotlin 和 Java 中,String 不是原始类型。实际上,在 Kotlin 中,直到代码编译之前,根本没有明显的原始类型,因此 Int 可能会成为 JVM 的原始类型,也可能不会。 - thinkgruen
这个回答解决了你的问题吗?Kotlin和判别联合(总和类型) - outis
2个回答

8
在Kotlin问题跟踪器中存在一个问题:可指示的联合和交集类型(其中还包含几个以前的讨论链接)。团队最近的更新为:

Roman Elizarov 在 2021年11月19日18:14发表了评论
关于此问题的简短更新。这是一个有趣且重要的功能,但在向后兼容和实用的方式下将其集成到语言中确实很困难。当我们发布新的K2编译器时,我们将完全开始着手处理它,并且我们最好的编译器工程师将能够开始研究。


3
据我所知,在 Kotlin 中并没有真正的“漂亮”的方法来实现这一点。
一个可以容纳字符串和整数的变量的实现方式可能如下:
var x: Any = 5
x = "hello"

但是你可以注意到,X不仅能够保存字符串和整数等任何类型,还可以使用Arrow库中的“Either”类(如果我没有弄错的话),可以实现这种行为:

var x = Either<Int, String>(5)

无论如何,我并不确定为什么你需要这样一个变量。


4
Either是另一种单子,通常用于函数式编程。一个典型的使用场景是在方法中当意图返回值(这里是Int)的计算失败时返回一个错误消息。它避免了类型转换,无论是否聪明都需要进行(在第一种情况中需要执行任何有意义的操作)。 - thinkgruen
2
看起来这是个不错的解决方案,但不幸的是我正在寻找更本地化的联合类型支持,尽管我认为我不会找到。上面只是一个例子,实际上我正在构建一种DSL,并且在使用lambda重载函数调用时遇到了一些问题。因此,我希望能够返回多种类型而不是重载。 - Ben Kosten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接