我想弄清楚如何在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()中期望Type参数,这实际上是非常合理的。
我试过
object Empty: Tree<T>()
但它导致了“未解决的参考:T”。作为最后的手段,我试着写
object Empty<T>: Tree<T>()
但编译器说“对象不允许输入参数”
有没有办法在Kotlin表达这个?空应该是单身,这就是为什么它应该是一个对象。通过使它成为一个类,它解决了编译器的问题,但是我必须在它后面添加括号= =&gt;空()。此外,它创建了不必要的对象,而它确实应该是一个单例值。
我对此问题有任何帮助表示感谢。 :)
答案 0 :(得分:16)
首先,您需要将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
相反。