Generics 使用子类类型参数重写泛型函数
我在kotlin中有以下接口,不可修改,因为它是在第三方库中定义的。我想使用子类的类型参数覆盖泛型方法:Generics 使用子类类型参数重写泛型函数,generics,kotlin,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 Concre
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
}
}
接口工厂{
趣味创建(modelClass:Class):T
}
//朴素的解决方案不编译:“类不是抽象的,不实现抽象成员”:
类ConcreteFactory1(val创建者:()->T):工厂{
重写趣味创建(modelClass:Class):T{
返回创建者()
}
}
//如果我们引入第二个类型参数,它将编译,但会生成“Unchecked Cast”警告:
类ConcreteFactory2(val创建者:()->T):工厂{
覆盖乐趣创建(模型类:类):T2{
将creator()返回为T2
}
}
有没有一种方法可以在没有编译警告的情况下实现这一点?视情况而定。
该接口要求您能够处理任何可能的类
,而您的实现却不能
因此,问题是当调用create
的类型不是您的ConcreteFactory2
可以创建的类型时,您想做什么
如果您唯一不想看到未选中的强制转换,可以执行以下操作:
class-ConcreteFactory2(val-creator:()->T):工厂{
覆盖乐趣创建(模型类:类):T2{
将创建者()返回为?T2?:抛出IllegalArgumentException(“不支持的类型”)
}
}
但这是否是该接口的可接受实现实际上取决于如何使用该接口。此解决方案仍然存在警告
未检查强制转换:T到T2
,因为类型未具体化,我认为安全强制转换操作符无法工作。当它返回时,您只会得到一个ClassCastException,而不是信息更丰富的IllegalArgumentException。但是如果你在构造函数中有一个KClass属性,那么这个方法就可以工作,这样类型就可以被具体化并检查是否真实。我错了。那只会具体化T,而不是T2。没有办法具体化T2,所以你不能安全地施放。哎呀,对不起,我没试过