使用子类类型参数覆盖泛型函数

时间:2020-05-15 12:19:33

标签: generics kotlin

我在kotlin中有以下接口,由于在第三方库中定义,因此无法修改。而且我想使用子类的类型参数覆盖通用方法:

interface Factory {
    fun <T> create(modelClass: Class<T>): T
}


// The naive solution doesn't compile :  "Class is not abstract and does not implement abstract member":
class ConcreteFactory1 <T> (val creator: () -> T) : Factory {
    override fun create(modelClass: Class<T>): T {
        return creator()
    }
}


// If we introduce a second type parameter, it compiles, but generates a "Unchecked Cast" warning:
class ConcreteFactory2 <T> (val creator: () -> T) : Factory {
    override fun <T2> create(modelClass: Class<T2>): T2 {
        return creator() as T2
    }
}

是否有一种无需编译警告就可以实现这一目标的方法?

1 个答案:

答案 0 :(得分:1)

这取决于。 该接口要求您能够处理所有可能的Class<T>,而您的实现则不能。

所以问题是,当调用create的类型不是您的ConcreteFactory2可以创建的类型时,您想做什么?

如果您唯一想做的就是不查看未经检查的演员表,则可以执行以下操作:

class ConcreteFactory2 <T> (val creator: () -> T) : Factory {
    override fun <T2> create(modelClass: Class<T2>): T2 {
        return creator() as? T2 ?: throw IllegalArgumentException("unsupported type")
    }
}

但是那是否是该接口的可接受实现,实际上取决于如何使用。

相关问题