首页 文章

Kotlin中的代数数据类型

提问于
浏览
12

我试图弄清楚如何在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 回答

  • 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 相反 .

相关问题