【发布时间】:2020-04-01 14:23:13
【问题描述】:
我正在为可空和不可空类型苦苦挣扎。有两个错误。 我定义了一个实现“队列”概念的类,如下所示,试图使其通用参数类型可以为空,这里有第一个错误:
class QueueLightweight<T: Any?> { //: Queue<T?> removed because of Java clashes, but it's another question
protected var size = 0
protected var first: NodeQLW<T>? = null
protected var last: NodeQLW<T>? = null
protected class NodeQLW<E>(var item: E) {
var next: NodeQLW<E>? = null
}
....
fun iterator(): Iterator<T> {
return IteratorQLW(this)
}
....
fun add(e: T?): Boolean {
val n: NodeQLW<T>
n = NodeQLW(e) // <--- first error:
// "type inference failed: required: QueueLightweight.NodeQLW<T> , found: QueueLightweight.NodeQLW<T?> "
if (size == 0) {
last = n
first = last
size = 1
} else {
last!!.next = n
last = n
size++
}
return true
}
}
然后我定义了一个 Iterator 子类,如下所示,在突出显示的行(通过箭头),有错误。
protected class IteratorQLW<E: Any?>(var q: QueueLightweight<E>) :
Iterator<E> {
var n: NodeQLW<E>?
init {
n = q.first
}
override fun hasNext(): Boolean {
return n != null
}
override fun next(): E {
var e: E
e = null // <--- error here: null cannot be a value of a non-null type E
if (n != null) {
e = n!!.item
n = n!!.next
}
return e
}
}
我不明白如何修复这些错误。
【问题讨论】:
标签: generics kotlin types parameters non-nullable