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

时间:2017-12-13 15:10:22

标签: generics kotlin kotlin-generics

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

所以使用界面:

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

和班级

class Music: Content
class Video: Content

cloneMe()类的函数Music应返回Music对象,cloneMe()类的函数Video应返回{{1}对象。

我最接近的是:

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>()

这是有问题的。

实现这一目标的最佳途径是什么?

2 个答案:

答案 0 :(得分:4)

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

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

实施:

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

答案 1 :(得分:2)

您尝试实现的内容与任何泛型无关。相反,您可以直接使用该类型并实现更详细的覆盖。

interface Content {
    fun cloneMe(): Content
}

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