【问题标题】:Replacing SAM-constructor with lambda with covariant type用具有协变类型的 lambda 替换 SAM 构造函数
【发布时间】:2016-04-08 09:46:37
【问题描述】:

我有以下 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的实现类需要为函数a()返回Test&lt;B&gt;,其中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
    }
}

【问题讨论】:

    标签: kotlin


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      相关资源
      最近更新 更多