Android开发:如何定义带双泛型(V为View子类)且实现接口的Kotlin类
Kotlin泛型类:正确的多约束写法
嘿,我来帮你搞定这个Kotlin泛型类的语法问题~
你想要让泛型V同时满足两个条件:是View的子类,并且实现MyInterface接口。你的两种写法都有小问题,正确的语法应该是这样的:
class Test<T, V>(val value1: String, val map: Map<T, V>) where V : View, V : MyInterface
为什么你的两种写法不对?
- 第一种写法
where V: View, MyInterface:这里的MyInterface没有指定是泛型V要实现它,编译器会把它当成一个独立的约束条件(比如要求MyInterface是某个类型),这显然不是你想要的。 - 第二种写法
where V: View: MyInterface:Kotlin的where子句不支持这种链式的约束写法,每个约束都需要明确绑定到对应的泛型参数,所以必须分开写V : View和V : MyInterface。
补充说明
在Kotlin中,当一个泛型参数需要多个约束(比如继承类+实现接口),所有约束都要在where子句里单独声明,并且每个约束都要指定对应的泛型参数。如果是单个约束,你也可以直接写在泛型参数后面,比如class Test<T, V : View>(...),但多个约束就必须用where子句来拆分。
举个完整的示例方便你理解:
// 先定义你的接口 interface MyInterface { fun doSomething() } // 正确的Test类写法 class Test<T, V>(val value1: String, val map: Map<T, V>) where V : View, V : MyInterface // 一个符合约束的子类示例 class CustomView(context: Context) : View(context), MyInterface { override fun doSomething() { // 实现接口方法 } } // 使用Test类 val test = Test<String, CustomView>("testValue", mapOf("key" to CustomView(context)))
内容的提问来源于stack exchange,提问作者user3626048
相关产品推荐
相关产品推荐

