You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:24:08