我有这个抽象功能:
abstract fun <T> updateValue(value: T)
现在,我希望子类使用集合将其覆盖为通用类型:
override fun <List<Int>> updateValue(value: List<Int>)
,这不起作用。基本类型工作得很好(字符串,整数等),但是当我想使用集合时,我不知道正确的语法。可以:
override fun <String> updateValue(value: String)
答案 0 :(得分:5)
您不能使用固定参数覆盖泛型函数,而是可以在类或接口上使用type参数来实现。例如
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
。它不会进行模式匹配来找到最合适的匹配。
您可以尝试在泛型函数的实现中检查类型以支持特定的情况,但是总的来说,由于type erasure,收集类可能会很困难。
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
可能help。
答案 1 :(得分:3)
似乎您实际上想在类上使用通用参数:
abstract class Parent<T> {
abstract fun updateValue(value: T)
}
然后将其扩展为:
class Child : Parent<List<Int>> {
override fun updateValue(value: List<Int>)
}
使用String
进行覆盖的唯一原因
override fun <String> updateValue(value: String)
是String
在此上下文中不是类型,而是您之前用来命名T
的通用参数的名称。 List<Int>
是无效名称。