用具有协变类型的lambda替换SAM构造函数

nha*_*man 9 kotlin

我有以下Java接口:

interface Action1<T> {

    void call(T t);
}

interface Test<T> {

    void test(Action1<? super T> action)
}
Run Code Online (Sandbox Code Playgroud)

以下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() }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在在函数中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
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 1

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