接口中的泛型函数以返回具体实现

asc*_*sco 5 generics kotlin kotlin-generics

我想向接口添加一个函数,该函数返回具体实现的对象。

因此,使用界面:

interface Content {
        fun <???> cloneMe(): ?
}
Run Code Online (Sandbox Code Playgroud)

和班级

class Music: Content
class Video: Content
Run Code Online (Sandbox Code Playgroud)

该功能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
    }
}
Run Code Online (Sandbox Code Playgroud)

那我就可以

val music: Music = Music().cloneMe<Music>()
Run Code Online (Sandbox Code Playgroud)

这里的问题是我必须进行未经检查的强制转换,“允许我”(即可以编译)执行

class Music : Content {
        override fun <T : Content> cloneMe(): T {
            return Video() as T
        }
}
Run Code Online (Sandbox Code Playgroud)

这是有问题的。

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

hot*_*key 6

通常,这也可以通过参数化Content接口来完成,如下所示:

interface Content<T : Content<T>> {
    fun cloneMe(): T
}
Run Code Online (Sandbox Code Playgroud)

并执行:

class Music : Content<Music> {
    override fun cloneMe(): Music {
        return Music()
    }
}
Run Code Online (Sandbox Code Playgroud)