Общая функция в интерфейсе для возврата конкретной реализации

В интерфейс я хочу добавить функцию, которая возвращает объект конкретной реализации.

Итак, с интерфейсом:

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()
}
Другие вопросы по тегам