我试图弄清楚如何在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表达这个?空应该是单身,这就是为什么它应该是一个对象 . 通过使它成为一个类,它解决了编译器的问题,但是我必须在它之后添加括号=> Empty() . 此外,它创建了不必要的对象,而它确实应该是一个单例值 .
我对这个问题有任何帮助表示感谢 . :)
1 回答
首先,您需要将
T
设为out
参数 . 然后,您可以使用Nothing
作为Empty
的类型参数 .Nothing
是Kotlin中的一种特殊类型,它不能具有实例,并且是所有其他类型的子类型 . 所以我想说它与Kotlin类型层次结构中的Any
相反 .