Kotlin中如何为元素同时实现InterfaceCustomFirebaseData和InterfaceIdentifiable接口的List编写扩展函数?
Kotlin扩展函数:让List元素同时满足两个接口的正确写法
你之前写的针对List<InterfaceCustomFirebaseData>的扩展函数没问题,但想让列表元素同时实现两个接口时,直接写两个泛型参数肯定行不通——毕竟Kotlin的List接口只接受一个类型参数,编译器报错就是这个原因。
要实现“元素同时符合两个接口”的要求,你需要用**Kotlin的泛型约束(where子句)**来限定泛型类型。具体写法如下:
fun <T> List<T>.toFirebaseDate(): MutableMap<String, Any> where T : InterfaceCustomFirebaseData, T : InterfaceIdentifiable { val firebaseData: MutableMap<String, Any> = mutableMapOf() this.forEach { // 因为T同时实现了两个接口,所以可以安全调用it.id和it.toFirebaseData() firebaseData[it.id] = it.toFirebaseData() } return firebaseData }
简单解释下这个写法:
- 首先声明泛型
<T>,作为列表的元素类型 - 用
where关键字列出T需要满足的所有约束:这里要求T必须同时实现InterfaceCustomFirebaseData和InterfaceIdentifiable两个接口 - 这样一来,函数内部就可以放心调用两个接口里定义的方法和属性(比如
it.id来自InterfaceIdentifiable,it.toFirebaseData()来自InterfaceCustomFirebaseData),编译器也会认可这种调用的合法性
这样写之后,只要传入的List的元素同时实现了这两个接口,就能正常调用这个扩展函数啦。
内容的提问来源于stack exchange,提问作者HixField
相关产品推荐
相关产品推荐

