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
如何使用在Kotlin中返回带有类型参数的子类型的方法创建类?_Kotlin_Generics_Type Parameter - Fatal编程技术网

如何使用在Kotlin中返回带有类型参数的子类型的方法创建类?

如何使用在Kotlin中返回带有类型参数的子类型的方法创建类?,kotlin,generics,type-parameter,Kotlin,Generics,Type Parameter,我很难理解泛型/类型参数在Kotlin中是如何工作的。我正在开发一个(相当复杂)的应用程序,它在编译过程中会抛出一些非常混乱的错误消息。我已经将下面的内容简化为将再现错误的代码的最小数量 我有一个接口和两个抽象类: 界面播放器{ 趣味游戏 } 抽象类设备{ 抽象趣味getPlayer():T } 抽象类设备工厂{ 抽象趣味创建():设备 } 当我试图创建一个实现DeviceFactory的类时,问题就出现了: 类MyDeviceFactory:DeviceFactory(){ 类MyPlaye

我很难理解泛型/类型参数在Kotlin中是如何工作的。我正在开发一个(相当复杂)的应用程序,它在编译过程中会抛出一些非常混乱的错误消息。我已经将下面的内容简化为将再现错误的代码的最小数量

我有一个接口和两个抽象类:

界面播放器{
趣味游戏
}
抽象类设备{
抽象趣味getPlayer():T
}
抽象类设备工厂{
抽象趣味创建():设备
}
当我试图创建一个实现
DeviceFactory
的类时,问题就出现了:

类MyDeviceFactory:DeviceFactory(){
类MyPlayer:Player{
玩乐{
println(“[此处播放声音]”)
}
}
类MyDevice:Device(){
覆盖有趣的getPlayer()=MyPlayer()
}
重写fun create()=MyDevice()
}
最后一行代码是出现问题的地方,产生以下错误消息:

Conflicting overloads: public open fun create(): MyDeviceFactory.MyDevice defined in MyDeviceFactory, public abstract fun create(): Device defined in DeviceFactory Return type of 'create' is not a subtype of the return type of the overridden member 'public abstract fun create(): Device defined in DeviceFactory' 没有骰子:

Type mismatch: inferred type is MyDeviceFactory.MyDevice but Device was expected 类型不匹配:推断的类型为MyDeviceFactory.MyDevice,但应为设备
如何创建一个派生自
DeviceFactory
并返回
MyDevice
实例的类?

您需要在其类上声明
DeviceFactory
的类型:

abstract class DeviceFactory<T : Player> {
    abstract fun create(): Device<T>
}
抽象类DeviceFactory{
抽象趣味创建():设备
}
然后您可以定义一个返回具体玩家的工厂:

类MyDeviceFactory:DeviceFactory(){
重写趣味创建():Device=MyDevice()
}

out
是reduntand,将导致编译error@IR42你是对的,
out
是多余的。我更新了我的答案。谢谢虽然这不会导致我的代码中出现编译错误。