匿名内部类
kotlin
interface RequestObserver {
fun onSuccess(data: String)
fun onError(error: String)
}
kotlin
fun requestUserInfo(requestObserver: RequestObserver) {
val requestResult = true
Thread {
Thread.sleep(3 * 1000)
if (requestResult) {
requestObserver.onSuccess("requestUserInfo 请求成功")
} else {
requestObserver.onError("requestUserInfo 请求失败")
}
}.start()
}
kotlin
requestUserInfo(
object : RequestObserver {
override fun onSuccess(data: String) {
Toast.makeText(context, data, Toast.LENGTH_SHORT).show()
}
override fun onError(error: String) {
Toast.makeText(context, error, Toast.LENGTH_SHORT).show()
}
}
)
匿名内部类简化
kotlin
fun interface SimpleRequestObserver {
fun onFinish(result: String)
}
kotlin
fun simpleRequestUserInfo(simpleRequestObserver: SimpleRequestObserver) {
Thread {
Thread.sleep(3 * 1000)
simpleRequestObserver.onFinish("simpleRequestUserInfo 请求完成")
}.start()
}
- 当接口只有一个抽象方法时,允许使用 fun 关键字修饰接口,这样可以简化实现,省略 object 关键字
kotlin
// 冗余的写法
simpleRequestUserInfo(
SimpleRequestObserver {
Toast.makeText(context, it, Toast.LENGTH_SHORT).show()
}
)
kotlin
simpleRequestUserInfo(
{
Toast.makeText(context, it, Toast.LENGTH_SHORT).show()
}
)
kotlin
// 等价于
simpleRequestUserInfo(
object : SimpleRequestObserver {
override fun onFinish(result: String) {
Toast.makeText(context, result, Toast.LENGTH_SHORT).show()
}
}
)
- 也可以使用 Lambda 表达式,最简洁的实现
kotlin
simpleRequestUserInfo {
Toast.makeText(context, it, Toast.LENGTH_SHORT).show()
}
- fun 关键字无法修饰有多个抽象方法的接口
kotlin
fun interface RequestObserver {
fun onSuccess(data: String)
fun onError(error: String)
}
# 输出结果
Fun interfaces must have exactly one abstract method
- 所有 Java 定义的、只有一个抽象方法的接口,都可以自动用 Lambda 表达式,哪怕接口不是用 fun 关键字修饰的
java
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
kotlin
Thread {
println("线程运行中: ${Thread.currentThread().name}")
}.start()