SAM
“Redundant SAM constructor” 是 Kotlin 编译器或 IDE(如 Android Studio)在 lambda 表达式转接口实例(SAM) 时给出的 冗余代码提示。
什么是 SAM?
SAM(Single Abstract Method)是指只包含一个抽象方法的接口,比如 Java 的 Runnable、OnClickListener 等。Kotlin 支持直接用 lambda 表达式来创建这些接口的实现,称为 SAM 转换。
“Redundant SAM constructor”的意思
你用了一个 显式的 SAM 构造器函数(比如 Runnable { … } 或 object : Runnable { … }),但 Kotlin 可以 自动将 lambda 转换成接口实例,所以提示你这是「冗余」的。
示例对比
冗余写法(IDE 会提示
Redundant SAM constructor
):
val r = Runnable { println("Run!") } // Kotlin 能自动转,显式写 Runnable 是多余的
val r = Runnable { println("Run!") } // Kotlin 能自动转,显式写 Runnable 是多余的
val r = Runnable { println("Run!") } // Kotlin 能自动转,显式写 Runnable 是多余的
推荐写法:
val r = { println("Run!") } // Kotlin 会自动推断成 Runnable(如果上下文需要)
val r = { println("Run!") } // Kotlin 会自动推断成 Runnable(如果上下文需要)
val r = { println("Run!") } // Kotlin 会自动推断成 Runnable(如果上下文需要)
或在函数调用中:
fun doSomething(runnable: Runnable) {}
doSomething(Runnable { println("Hello") }) //
冗余
doSomething { println("Hello") } //
推荐
fun doSomething(runnable: Runnable) {}
doSomething(Runnable { println("Hello") }) //
冗余
doSomething { println("Hello") } //
推荐
fun doSomething(runnable: Runnable) {} doSomething(Runnable { println("Hello") }) //冗余 doSomething { println("Hello") } //
推荐
IDE 快捷修复
在 Android Studio 或 IntelliJ 中,光标移到提示上,点击 “Replace with lambda” 即可自动简化。
注意场景
不是所有时候都能省略:
val runnable = Runnable { println("A") } // 合理,如果你明确想创建 Runnable 对象
val runnable = Runnable { println("A") } // 合理,如果你明确想创建 Runnable 对象
val runnable = Runnable { println("A") } // 合理,如果你明确想创建 Runnable 对象
但如果你是在调用一个函数,并传 lambda 给一个只接受 SAM 的参数,就可以简化。
总结
用法 | 是否冗余 |
---|---|
Runnable { … } | |
object : Runnable { … } |