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)
这是有问题的。
实现此目标的最佳方法是什么?
通常,这也可以通过参数化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)