Kotlin序列类型推断

4

我遇到了以下问题,无法解决:

class Node(val next: Node?) {

    fun asSequence(): Sequence<Node> = sequence {
        var node: Node? = this@Node;
        while (node != null) {
            yield(node)
            node = node.next
        }
    }
}

编译器显然失败了:
Type inference failed. Expected type mismatch: inferred type is Sequence<Node?> but Sequence<Node> was expected

我希望序列是Sequence<Node>,而不是Sequence<Node?>,这应该是可能的,因为yield()在一个空检查后面。
当我将yield(node)更改为yield(node!!)yield(node as Node)时,类型推断可以工作,但现在我会收到编译器警告:
Unnecessary non-null assertion (!!) on a non-null receiver of type Node

如何创建一个没有编译器警告的 Sequence<Node>
1个回答

4

看起来是 Kotlin 编译器问题。你可以帮助编译器一下,当序列类型尚未确定时显式设置序列类型。

class Node(val next: Node?) {
    fun asSequence(): Sequence<Node> = sequence<Node> {
        var node: Node? = this@Node;
        while (node != null) {
            yield(node)
            node = node.next
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接