Общая функция в интерфейсе для возврата конкретной реализации
В интерфейс я хочу добавить функцию, которая возвращает объект конкретной реализации.
Итак, с интерфейсом:
interface Content {
fun <???> cloneMe(): ?
}
и классы
class Music: Content
class Video: Content
функция cloneMe()
из Music
класс должен вернуть Music
объект и функция cloneMe()
из Video
класс должен вернуть Video
объект.
Самое близкое, что я пришел, это:
interface Content {
fun <T: Content> cloneMe(): T
}
class Music : Content {
override fun <T : Content> cloneMe(): T {
return Music() as T
}
}
тогда я могу сделать
val music: Music = Music().cloneMe<Music>()
Проблема здесь заключается в том, что мне нужно выполнить неконтролируемое приведение, которое "позволяет мне" (т.е. компилирует)
class Music : Content {
override fun <T : Content> cloneMe(): T {
return Video() as T
}
}
что проблематично.
Какой лучший способ достичь этого?
2 ответа
Решение
Обычно это делается путем параметризации Content
интерфейс, а также:
interface Content<T : Content<T>> {
fun cloneMe(): T
}
И реализация:
class Music : Content<Music> {
override fun cloneMe(): Music {
return Music()
}
}
То, что вы пытаетесь достичь, не обязательно связано с какими-либо обобщениями. Вместо этого вы можете просто использовать тип напрямую и реализовать более подробное переопределение.
interface Content {
fun cloneMe(): Content
}
class Music : Content {
override fun cloneMe() = Music()
}