return 具体实现接口中的通用函数

Generic function in interface to return concrete implementation

对于接口,我想添加一个函数,return是具体实现的一个对象。

所以有了界面:

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

和 classes

class Music: Content
class Video: Content

Music class 的函数 cloneMe() 应该 return 一个 Music 对象和 cloneMe() 的函数 Video class 应该 return 一个 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>()

这里的问题是我必须做一个未经检查的转换,'allows me'(即会编译)做

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

这是有问题的。

实现此目标的最佳方法是什么?

通常这也是通过参数化 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()
}