移动开发

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

):

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
val r = Runnable { println("Run!") } // Kotlin 能自动转,显式写 Runnable 是多余的
val r = Runnable { println("Run!") } // Kotlin 能自动转,显式写 Runnable 是多余的
val r = Runnable { println("Run!") } // Kotlin 能自动转,显式写 Runnable 是多余的

✅ 推荐写法:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
val r = { println("Run!") } // Kotlin 会自动推断成 Runnable(如果上下文需要)
val r = { println("Run!") } // Kotlin 会自动推断成 Runnable(如果上下文需要)
val r = { println("Run!") } // Kotlin 会自动推断成 Runnable(如果上下文需要)

或在函数调用中:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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” 即可自动简化。


⚠️ 注意场景

不是所有时候都能省略:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
val runnable = Runnable { println("A") } // 合理,如果你明确想创建 Runnable 对象
val runnable = Runnable { println("A") } // 合理,如果你明确想创建 Runnable 对象
val runnable = Runnable { println("A") } // 合理,如果你明确想创建 Runnable 对象

但如果你是在调用一个函数,并传 lambda 给一个只接受 SAM 的参数,就可以简化


✅ 总结

用法是否冗余
Runnable { … }✅ 冗余,可用 lambda 替代
object : Runnable { … }❌ 合理(特别是多方法或自定义逻辑)

留言

您的邮箱地址不会被公开。 必填项已用 * 标注