Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics Kotlin:如何将集合传递到函数的泛型类型_Generics_Kotlin - Fatal编程技术网

Generics Kotlin:如何将集合传递到函数的泛型类型

Generics Kotlin:如何将集合传递到函数的泛型类型,generics,kotlin,Generics,Kotlin,我有一个抽象的功能: abstract fun <T> updateValue(value: T) abstract fun updateValue(值:T) 现在我想让一个子类用一个集合将其重写为泛型类型: override fun <List<Int>> updateValue(value: List<Int>) override fun updateValue(值:List) 这是行不通的。基本类型工作得很好(String、I

我有一个抽象的功能:

    abstract fun <T> updateValue(value: T)
abstract fun updateValue(值:T)
现在我想让一个子类用一个集合将其重写为泛型类型:

override fun <List<Int>> updateValue(value: List<Int>)
override fun updateValue(值:List)
这是行不通的。基本类型工作得很好(String、Int等),但是当我想使用集合时,我不知道正确的语法。这没关系:

override fun <String> updateValue(value: String)
override fun updateValue(值:字符串)

看起来您实际上希望在类上使用泛型参数:

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

String
不是此上下文中的类型,而是您以前用来命名
T
的泛型参数的名称<代码>列表但是不是有效的名称。

您不能用固定参数重写泛型函数,相反,您可以在类或接口上使用类型参数使其生效。例如

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) { /*...*/ }
}

您无法从这里的
List
中辨别
List
。带有
具体化的
泛型的
内联fun
可以

override fun <String> updateValue(value: String)
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) {
  when (value) {
    is String -> handleStringValue(value)
    is List<*> -> handleListValue(value)
    else -> handleDefault(value)
  }
}