5

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

所以有了界面:

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

和班级

class Music: Content
class Video: Content

cloneMe()类的函数Music应该返回一个对象,而类Music的函数应该返回一个对象。cloneMe()VideoVideo

我最接近的是:

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

这里的问题是我必须做一个未经检查的演员表,这“允许我”(即会编译)做

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

这是有问题的。

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

4

2 回答 2

12

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

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

和实施:

class Music : Content<Music> {
    override fun cloneMe(): Music {
        return Music()
    }
}
于 2017-12-13T15:18:18.450 回答
2

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

interface Content {
    fun cloneMe(): Content
}

class Music : Content {
    override fun cloneMe() = Music()
}
于 2017-12-13T15:34:20.660 回答