Вы не можете переопределить обобщенную функцию с фиксированным параметром, вместо этого у вас может быть параметр типа в классе или интерфейсе для его создания. Э.Г.
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
генериками может помочь .