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

时间:2016-04-08 09:46:38

标签: kotlin

我有以下Java接口:

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:< / p>

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
    }
}

1 个答案:

答案 0 :(得分:1)

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