gpt4 book ai didi

kotlin - Kotlin 中的代数数据类型

转载 作者:IT老高 更新时间:2023-10-28 13:33:02 26 4
gpt4 key购买 nike

我正在尝试弄清楚如何在 Kotlin 中使用代数数据类型,因此我尝试通过以下方式实现基本的 BinaryTree 类型。

sealed class Tree<T>{
class Node<T>(val left: Tree<T>, val right: Tree<T>): Tree<T>()
class Leaf<T>(val value: T): Tree<T>()
}

这一切都很好,让我构建以下树:

val myTree1: Tree<Int> = Node(Leaf(4), Leaf(2))

但是我也想有一个“空”类型,所以我可以表达以下内容:

val myTree1: Tree<Int> = Node(Node(Leaf(4), Leaf(3)), Empty)

我尝试了以下方法:

sealed class Tree<T>{
class Node<T>(val left: Tree<T>, val right: Tree<T>): Tree<T>()
class Leaf<T>(val value: T): Tree<T>()
object Empty: Tree()
}

虽然我得到了在 object Empty: Tree() 中需要 Type 参数的错误,这实际上是很合乎逻辑的。

我试过了

object Empty: Tree<T>()

但它导致“ Unresolved 引用:T”。作为最后的手段,我尝试写作

object Empty<T>: Tree<T>()

但编译器说“对象不允许使用类型参数”

有没有办法在 Kotlin 中表达这一点? Empty 应该是一个单例,这就是为什么它应该是一个对象。通过使其成为一个类,它解决了编译器问题,但是我必须像 => Empty() 那样在它后面加上括号。此外,它创建了不必要的对象,而它实际上应该是一个单例值。

如果能在这个问题上提供任何帮助,我将不胜感激。 :)

最佳答案

首先你需要使 T 成为一个 out 参数。然后你可以使用 Nothing 作为 Empty 的类型参数。

sealed class Tree<out T>{
class Node<T>(val left: Tree<T>, val right: Tree<T>): Tree<T>()
class Leaf<T>(val value: T): Tree<T>()
object Empty: Tree<Nothing>()
}

Nothing 是 Kotlin 中的一种特殊类型,它不能有实例,是所有其他类型的子类型。所以我想说它与 Kotlin 类型层次结构中的 Any 相反。

关于kotlin - Kotlin 中的代数数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36753579/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com