Función genérica en la interfaz para devolver la implementación concreta

A una interfaz, quiero agregar una function que devuelve un object de la implementación concreta.

Entonces con la interfaz:

interface Content { fun <???> cloneMe(): ? } 

y las classs

 class Music: Content class Video: Content 

la function cloneMe() de la class Music debería devolver un object Music y la function cloneMe() de la class Video debería devolver un object Video .

Lo más cerca que he venido es:

 interface Content { fun <T: Content> cloneMe(): T } class Music : Content { override fun <T : Content> cloneMe(): T { return Music() as T } } 

entonces puedo hacer

 val music: Music = Music().cloneMe<Music>() 

El problema aquí es que tengo que hacer un reparto sin marcar, que 'me permite' (es decir, comstackrá) para hacer

 class Music : Content { override fun <T : Content> cloneMe(): T { return Video() as T } } 

que es problemático

¿Cuál es la mejor manera de lograr esto?

    Por lo general, esto se hace parametrizando la interfaz de Content también, de la siguiente manera:

     interface Content<T : Content<T>> { fun cloneMe(): T } 

    Y la implementación:

     class Music : Content<Music> { override fun cloneMe(): Music { return Music() } } 

    Lo que intentas lograr no es necesario en relación con ningún genérico. En su lugar, puede usar el tipo directamente e implementar una anulación más detallada.

     interface Content { fun cloneMe(): Content } class Music : Content { override fun cloneMe() = Music() }