我有这个抽象功能:
abstract fun <T> updateValue(value: T)
Run Code Online (Sandbox Code Playgroud)
现在,我希望一个子类使用一个集合将其覆盖为通用类型:
override fun <List<Int>> updateValue(value: List<Int>)
Run Code Online (Sandbox Code Playgroud)
这是行不通的。基本类型工作得很好(字符串,整数等),但是当我想使用集合时,我不知道正确的语法。还行吧:
override fun <String> updateValue(value: String)
Run Code Online (Sandbox Code Playgroud)
您不能使用固定的参数覆盖泛型函数,而是可以在类或接口上使用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) { /*...*/ }
}
Run Code Online (Sandbox Code Playgroud)
声明泛型函数时的基本原理如下,例如fun <T> updateValue(value: T),意味着它应适用于所有可能的情况T。它不会进行模式匹配来找到最合适的匹配。
您可以尝试在泛型函数的实现中检查类型以支持特定的情况,但是通常,由于类型为rasure,对于收集类而言可能很难。
fun <T> updateValue(value: T) {
when (value) {
is String -> handleStringValue(value)
is List<*> -> handleListValue(value)
else -> handleDefault(value)
}
}
Run Code Online (Sandbox Code Playgroud)
你不能List<Int>从List<String>这里告诉。一个inline fun与reified仿制药可以帮助。
| 归档时间: |
|
| 查看次数: |
74 次 |
| 最近记录: |