首页 > 解决方案 > Kotlin:如何将集合传递给函数的泛型类型

问题描述

我有这个抽象功能:

    abstract fun <T> updateValue(value: T)

现在我想要一个子类用一个集合覆盖它到泛型类型中:

override fun <List<Int>> updateValue(value: List<Int>)

这不起作用。基本类型工作得很好(字符串、整数等),但是当我想使用集合时,我不知道正确的语法。还行吧:

override fun <String> updateValue(value: String)

标签: genericskotlin

解决方案


您不能使用固定参数覆盖泛型函数,相反,您可以在类或接口上使用类型参数来实现它。例如

abstract class BaseClass<T> {
  abstract fun updateValue(value: T) : Unit
}

///class to accept _only_ List<Int>
class ListClass<List<Int>> {
  override fun updateValue(value: List<Int>) { /*...*/ }
}

/// class to accept _only_ String
class StringClass<String> {
  override fun updateValue(value: String) { /*...*/ }
}

当您声明一个泛型函数时,基本原理如下,例如fun <T> updateValue(value: T)意味着它应该适用于所有可能的T. 它不会进行模式匹配来找到最合适的匹配。

您可以尝试在泛型函数的实现中检查类型以支持特定情况,但总的来说,由于类型擦除,对于集合类可能很难。

fun <T> updateValue(value: T) {
  when (value) {
    is String -> handleStringValue(value)
    is List<*> -> handleListValue(value)
    else -> handleDefault(value)
  }
}

你不能List<Int>List<String>这里说出来。一个inline fun带有reified泛型的可能会有所帮助


推荐阅读