【问题标题】:Array as Generic Type in Kotlin数组作为 Kotlin 中的通用类型
【发布时间】:2018-04-12 04:55:58
【问题描述】:

我在要求成员声明时遇到错误,我不知道为什么。我一直在尝试查找内容,但似乎无法找到为什么这是无效的答案。我可以做到val listOfArr = ArrayList<Array<String>>() 就好了。为什么这不起作用?

class Implements: IPatternCheck {

    override fun <Array<String>> check(classData: ClassData, value: Array<String>): Boolean {
       return true
    }
}

这是我的界面

interface IPatternCheck {
    fun<T> check(classData: ClassData, value: T): Boolean
}

【问题讨论】:

  • 你的界面是什么样的?您究竟想让代码的哪一部分通用化?
  • 我想让它采用 Array 类型的检查方法,但它给我一个编译错误

标签: arrays generics kotlin


【解决方案1】:

如果你的接口声明了一个带有类型参数的函数,你必须在覆盖它时保持该类型参数不变 - 所以你必须在你的类中为它创建这个覆盖:

override fun <T> check(classData: ClassData, value: T): Boolean {
    // TODO
}

要使其采用特定类型,您应该使您的接口成为通用接口,而不仅仅是其中的函数,并使用作为类型参数传递的特定类型来实现接口:

interface IPatternCheck<T>  {
    fun check(classData: ClassData, value: T): Boolean
}

class Implements: IPatternCheck<Array<String>> {
    override fun check(classData: ClassData, value: Array<String>): Boolean {
        // TODO
    }
}

编辑,在下面的评论中回答问题。如果你这样做:

override fun <String> check(classData: ClassData, value: String): Boolean {
    // TODO
}

...您所做的只是将T 类型参数重命名String(相当混乱)。您实际上并没有使用存储字符序列的 kotlin.String 类。

例如,您仍然可以使用任何第二个参数调用Implements 的实例,它不会被限制为kotlin.String。它仍然是一个通用函数。

val implements = Implements()
implements.check(ClassData(), "foo")
implements.check(ClassData(), 25)

此外,您无法访问参数上的任何kotlin.String 函数:

override fun <String> check(classData: ClassData, value: String): Boolean {
    value.length // Unresolved reference: length
}

【讨论】:

  • 如果我必须保留泛型函数的类型参数,为什么我可以重写 fun check(classData: ClassData, value: String): Boolean { //TODO }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 1970-01-01
  • 2023-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多