У меня есть сценарий в моем коде, где я хотел бы, чтобы класс реализовал интерфейс для двух отдельных типов, например, этот пример:
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
}
}
Котлин не доволен этим, ссылаясь на:
Type parameter T of 'Speaker' has inconsistent values: kotlin.String, kotlin.Float
A supertype appears twice
Я знаю, что одним из возможных решений является реализация следующего кода, где я реализую интерфейс с <Any>
, а затем сам проверяю типы и делегирую их их функциям.
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
}
}
Тем не менее, это похоже на то, что я удаляю информацию о типе безопасности и сообщении о том, для чего используется класс, и задает проблемы по линии. Есть ли лучший способ реализовать это в Котлине? Кроме того, какие аргументы позади этого не допускаются, как я указал в первом примере? Не являются ли интерфейсы только контрактом подписей, которые мне требуются для реализации, или есть что-то, чего я не вижу, включая дженериков?