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是相反的。