Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 使用子类类型参数重写泛型函数_Generics_Kotlin - Fatal编程技术网

Generics 使用子类类型参数重写泛型函数

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

我在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
    }
}
接口工厂{
趣味创建(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,所以你不能安全地施放。哎呀,对不起,我没试过