【发布时间】:2016-08-13 17:01:01
【问题描述】:
我正在尝试弄清楚如何在 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()
}
虽然我得到了在 object Empty: Tree() 中需要 Type 参数的错误,这实际上是很合乎逻辑的。
我试过了
object Empty: Tree<T>()
但它导致“未解决的引用:T”。作为最后的手段,我尝试写作
object Empty<T>: Tree<T>()
但编译器说“对象不允许使用类型参数”
有没有办法在 Kotlin 中表达这一点? Empty 应该是一个单例,这就是为什么它应该是一个对象。通过使其成为一个类,它解决了编译器问题,但是我必须像 => Empty() 那样在它后面加上括号。此外,它创建了不必要的对象,而它实际上应该是一个单例值。
如果能在这个问题上提供任何帮助,我将不胜感激。 :)
【问题讨论】:
标签: kotlin algebraic-data-types