Kotlin中用Array作泛型实现接口时出现成员声明报错的疑问
问题分析与解决方案
这个问题的核心是你混淆了Kotlin中泛型参数的声明语法和类型实参的指定语法,咱们一步步拆解来看:
错误原因详解
你写的代码里:
override fun <Array<String>> check(classData: ClassData, value: Array<String>): Boolean
方法名后的<Array<String>>是在尝试声明泛型参数,但泛型参数的名字必须是合法的标识符(比如T、U这类单个字母或简单名称),而不能是像Array<String>这样的具体类型——这就好比你想给变量起名叫Int,显然是语法错误,编译器根本无法理解你要表达的意图,自然会抛出成员声明相关的错误。
而你能正常创建val listOfArr = ArrayList<Array<String>>(),是因为这里的<Array<String>>是在指定泛型类的类型实参,告诉编译器这个ArrayList的元素类型是Array<String>,这和方法里声明泛型参数的语法完全是两回事。
正确的实现方式
要正确实现这个泛型接口,你有两种选择:
1. 直接指定泛型方法的具体类型
如果你希望这个实现类的check方法只处理Array<String>类型的value,那直接去掉方法上的泛型声明,把参数类型写成Array<String>即可:
class Implements: IPatternCheck { override fun check(classData: ClassData, value: Array<String>): Boolean { return true } }
编译器会自动推断你是在实现接口中T为Array<String>的泛型方法版本。
2. 保持方法的泛型特性(可选)
如果你想让这个方法依然支持泛型,但约束T必须是Array<String>类型(或其子类,不过Kotlin的Array是不可变类型,实际没有子类),可以这样写:
class Implements: IPatternCheck { override fun <T : Array<String>> check(classData: ClassData, value: T): Boolean { return true } }
不过这种写法和第一种在功能上几乎没有区别,除非你需要利用泛型的其他特性。
本质上,你之前的错误就是把“指定泛型类型”的语法用到了“声明泛型参数”的位置上,搞混了两者的用法。
内容的提问来源于stack exchange,提问作者Plee
相关产品推荐
相关产品推荐

