pjo*_*sef 14 algebraic-data-types kotlin
我试图弄清楚如何在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>()
}
Run Code Online (Sandbox Code Playgroud)
这很好,让我构建以下树:
val myTree1: Tree<Int> = Node(Leaf(4), Leaf(2))
Run Code Online (Sandbox Code Playgroud)
但是我想要一个"空"类型,所以我可以表达以下内容:
val myTree1: Tree<Int> = Node(Node(Leaf(4), Leaf(3)), Empty)
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法:
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()
}
Run Code Online (Sandbox Code Playgroud)
虽然我得到的错误是在对象Empty:Tree()中期望Type参数,这实际上是非常合乎逻辑的.
我试过了
object Empty: Tree<T>()
Run Code Online (Sandbox Code Playgroud)
但它导致了"未解决的参考:T".作为最后的手段,我尝试写作
object Empty<T>: Tree<T>()
Run Code Online (Sandbox Code Playgroud)
但编译器说"不允许对象使用类型参数"
有没有办法在Kotlin表达这个?空应该是单身,这就是为什么它应该是一个对象.通过使它成为一个类,它解决了编译器的问题,但是我必须在它之后添加括号=> Empty().此外,它创建了不必要的对象,而它确实应该是一个单例值.
我对这个问题有任何帮助表示感谢.:)
Mic*_*ael 20
首先,您需要创建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>()
}
Run Code Online (Sandbox Code Playgroud)
Nothing是Kotlin中的一种特殊类型,它不能有实例,是所有其他类型的子类型.所以我会说它与AnyKotlin类型层次结构相反.
| 归档时间: |
|
| 查看次数: |
2256 次 |
| 最近记录: |