Tôi có một kịch bản trong mã của tôi mà tôi muốn một lớp học để thực hiện một giao diện cho hai loại riêng biệt, như ví dụ sau:Bất kỳ cách nào để kế thừa từ cùng một giao diện chung hai lần (với các kiểu riêng biệt) trong 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 là không hài lòng với điều này, với lý do:
Type parameter T of 'Speaker' has inconsistent values: kotlin.String, kotlin.Float
A supertype appears twice
Tôi biết rằng một giải pháp có thể là triển khai mã sau đây, nơi tôi triển khai giao diện với <Any>
và sau đó kiểm tra các loại bản thân và ủy quyền chúng cho các chức năng của chúng.
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
}
}
Tuy nhiên, điều đó có nghĩa là tôi đang xóa loại an toàn và thông tin liên lạc về lớp học được sử dụng và yêu cầu sự cố xuống dòng. Có cách nào tốt hơn để thực hiện điều này trong Kotlin? Ngoài ra - lý do đằng sau nó không được cho phép theo cách tôi đã chỉ ra trong mẫu đầu tiên là gì? Không phải giao diện chỉ là một hợp đồng chữ ký mà tôi được yêu cầu để thực hiện, hoặc có cái gì đó tôi đang thiếu liên quan đến generics ở đây?