Ich habe ein Szenario, in meinem Code, wo ich eine Klasse möchte eine Schnittstelle für zwei getrennte Arten, wie in diesem Beispiel implementieren:Jede Möglichkeit, in Kotlin von derselben generischen Schnittstelle zweimal (mit separaten Typen) zu erben?
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 ist nicht zufrieden mit diesem, unter Berufung auf:
Type parameter T of 'Speaker' has inconsistent values: kotlin.String, kotlin.Float
A supertype appears twice
Ich weiß, dass eine mögliche Lösung ist, den folgenden Code zu implementieren, wo ich die Schnittstelle mit <Any>
implementieren und dann die Typen selbst überprüfen und sie an ihre Funktionen delegieren.
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
}
}
jedoch, die wie ich fühlt mich Typ Sicherheit und Kommunikation über das Entfernen, was die Klasse für verwendet wird, und für die Bredouille bitte. Gibt es einen besseren Weg, dies in Kotlin umzusetzen? Zusätzlich - was ist der Grund dafür, dass es nicht so ist, wie ich es in der ersten Probe angegeben habe? Sind Interfaces nicht nur ein Vertrag von Signaturen, den ich implementieren muss, oder fehlt mir hier etwas, was Generika betrifft?