首页 > 解决方案 > 使用子类类型参数覆盖泛型函数

问题描述

我在 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
    }
}

有没有办法在没有编译警告的情况下实现这一点?

标签: genericskotlin

解决方案


这取决于。该接口要求您能够处理任何可能性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")
    }
}

但是,这是否是该接口的可接受实现真的取决于它是如何使用的。


推荐阅读