首页 > 解决方案 > 简单 SAM 需要转换为匿名对象

问题描述

我有以下简单的界面

interface A {
    fun move(s:Boolean): Int
}

我有以下课程

class X{
    fun draw (x: A): String{
        return "A"
    }

    fun main() {
      val temp = A {
          s -> 100
      }
      val a = draw ( { x -> 100} )
    }
}

但是两者都temp没有a被宣布。temp抱怨,建议的解决方法是按如下方式转换为匿名对象(这违背了使用 SAM 的全部目的?)

val temp = object : A {
        override fun move(s: Boolean): Int {
            return 100
        }
    }

a抱怨类型不匹配。我的问题是为什么这个简单的 SAM 会失败?方法签名是相同的。

标签: kotlin

解决方案


目前 Kotlin 仅对 Java 中定义的接口进行 SAM 转换。
对于纯 Kotlin 代码,您应该使用如下函数类型:

typealias A = (s: Boolean) -> Int

但是,您期望的语法将在 Kotlin 1.4 中得到支持,接口定义为fun interface.
如此处宣布的: Kotlin 1.4 及更高版本中的预期内容
并跟踪为KT-7770


推荐阅读