Kotlin中的代数数据类型
我想弄清楚如何在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() }
虽然我得到了类型参数预期在对象Empty:Tree(),这实际上很合乎逻辑的错误。
我试过了
object Empty: Tree<T>()
但它导致了“未解决的参考:T”。 作为最后的手段,我试着写作
object Empty<T>: Tree<T>()
但编译器说:“类型参数不允许用于对象”
Kotlin有没有办法表达这一点? 空应该是一个单身人士,这就是为什么它应该是一个对象。 通过使它成为一个类,它解决了编译器的问题,但是我必须在它之后加上括号,例如=> Empty()。 此外,它创建了不必要的对象,而它确实应该是一个单身的价值。
我很感谢在这个问题上的任何帮助。 🙂
首先你需要把T
一个参数。 那么你可以使用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
是相反的。