Kotlin 序列类型推断

标签 kotlin

我在解决以下问题时遇到问题:

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>没有编译器警告?

最佳答案

看起来像 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
        }
    }
}

关于Kotlin 序列类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57260614/

相关文章:

android - 为什么我不能定义 <T where T : CharSequence, T : Appendable> in Kotlin?

kotlin - 反射调用函数并使用默认参数

java - 使用通配符的 Kotlin 泛型自定义类型

android - 如何在上下文菜单中创建弹出菜单?

python - 如何在 Kotlin 中解密 AES/CBC 加密字符串?

java - 如何获取Android系统主题变更的通知?

android - Kotlin 协程返回字符串

kotlin - 查找表中的所有行,即使您必须向下滚动表

kotlin - 不能使用提供的参数调用以下函数

android - Kotlin 延迟加载在 Junit 测试中不起作用