Kotlin中的代数数据类型

时间:2016-04-20 19:38:51

标签: kotlin algebraic-data-types

我想弄清楚如何在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;空()。此外,它创建了不必要的对象,而它确实应该是一个单例值。

我对此问题有任何帮助表示感谢。 :)

1 个答案:

答案 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相反。