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 = { println("Run!") } // Kotlin 会自动推断成 Runnable(如果上下文需要)
或在函数调用中:
fun doSomething(runnable: Runnable) {} doSomething(Runnable { println("Hello") }) // ❌ 冗余 doSomething { println("Hello") } // ✅ 推荐
🚫 IDE 快捷修复
在 Android Studio 或 IntelliJ 中,光标移到提示上,点击 “Replace with lambda” 即可自动简化。
⚠️ 注意场景
不是所有时候都能省略:
val runnable = Runnable { println("A") } // 合理,如果你明确想创建 Runnable 对象
但如果你是在调用一个函数,并传 lambda 给一个只接受 SAM 的参数,就可以简化。
✅ 总结
用法 | 是否冗余 |
---|---|
Runnable { … } | ✅ 冗余,可用 lambda 替代 |
object : Runnable { … } | ❌ 合理(特别是多方法或自定义逻辑) |