我正在尝试学习如何在Kotlin中使用代数数据类型,因此我尝试以以下方式实现基本的二叉树类型。
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()
}
尽管我收到了“Type argument is expected at object Empty: Tree()”这个错误,但实际上这是相当合理的。
我尝试过。
object Empty: Tree<T>()
但是结果出现了“未解决的引用:T”。作为最后一招,我尝试编写:
object Empty<T>: Tree<T>()
但编译器会提示“对象不允许使用类型参数”
在Kotlin中有没有一种表达方式?Empty应该是一个单例,所以它应该是一个对象。通过将其设置为类,可以解决编译器问题,但然后我必须在其后加上括号,如=> Empty()。此外,它会创建不必要的对象,而它实际上应该是一个单例值。
我会很感谢任何关于这个问题的帮助。 :)
out
,就无法创建一个包含Leaf
和Empty
的Node
。 - Michaelsealed class Tree<out T : Comparable<T>> {..}
会出现错误“Kotlin:将类型参数T声明为“out”,但在类型Comparable <T>中处于“in”位置”。 - David SorokoEmpty
,移除out
并使用class Empty<T> : Tree<T>()
。然后你可以接受多个Empty
实例或手动管理单个特定类型的实例。 - David Soroko