gpt4 book ai didi

kotlin - 用协变类型的 lambda 替换 SAM 构造函数

转载 作者:IT老高 更新时间:2023-10-28 13:39:00 26 4
gpt4 key购买 nike

我有以下 Java 接口(interface):

interface Action1<T> {

void call(T t);
}

interface Test<T> {

void test(Action1<? super T> action)
}

还有以下 Kotlin 类:

interface A {
fun go()
}

abstract class Main {

abstract fun a(): Test<out A>

fun main() {
a().test(Action1 { it.go() })
a().test { it.go() }
}
}

现在在函数 main 中,第一条语句编译,但 IntelliJ 发出警告,SAM 构造函数可以替换为 lambda。这将导致第二个语句。

但是,第二条语句无法编译,因为 it有类型 Any? ,而不是 A .删除 out修饰符使其再次编译。

为什么会这样?


这个的用例是Main的实现类。需要返回Test<B>对于函数 a() , 其中 B实现 A :

class B : A {

override fun go() {
TODO()
}
}

class MainImp : Main() {
override fun a(): Test<out A> {
val value: Test<B> = object : Test<B> {
override fun test(action: Action1<in B>?) {
TODO()
}
};

return value
}
}

最佳答案

这是一个编译器错误。你可以在这里追踪它:https://youtrack.jetbrains.com/issue/KT-12238 .

关于kotlin - 用协变类型的 lambda 替换 SAM 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36496477/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com