Mam scenariusz w moim kodu, w którym chciałbym klasę zaimplementować interfejs do dwóch odrębnych typów, jak w poniższym przykładzie:Jakikolwiek sposób odziedziczyć z tego samego interfejsu generycznego dwukrotnie (z oddzielnymi typami) w Kotlin?
interface Speaker<T> {
fun talk(value: T)
}
class Multilinguist : Speaker<String>, Speaker<Float> {
override fun talk(value: String) {
println("greetings")
}
override fun talk(value: Float) {
// Do something fun like transmit it along a serial port
}
}
Kotlin nie jest zadowolony z tego, cytując:
Type parameter T of 'Speaker' has inconsistent values: kotlin.String, kotlin.Float
A supertype appears twice
Wiem, że jednym z możliwych rozwiązań jest wdrożenie następującego kodu, w którym implementuję interfejs z <Any>
, a następnie sprawdzam typy osobiście i deleguję je do ich funkcji.
interface Speaker<T> {
fun talk(value: T)
}
class Multilinguist : Speaker<Any> {
override fun talk(value: Any) {
when (value) {
is String ->
internalTalk(value)
is Float ->
internalTalk(value)
}
}
fun internalTalk(value: String) {
println(value)
}
fun internalTalk(value: Float) {
// Do something fun like transmit it along a serial port
}
}
jednak, że czuje się jakbym usunięcie typu bezpieczeństwa i komunikacji o co klasa jest używana do, i prosi o kłopoty w dół. Czy istnieje lepszy sposób na wdrożenie tego w Kotlin? Dodatkowo - co jest przyczyną tego, że nie jest dozwolone tak, jak wskazałem w pierwszej próbce? Czy interfejsy to nie tylko kontrakt z podpisami, które muszę wprowadzić, czy też jest coś, czego mi brakuje z udziałem generycznych?