【发布时间】:2021-04-21 14:22:24
【问题描述】:
我很难理解泛型/类型参数在 Kotlin 中的工作原理。我正在开发一个(相当复杂的)应用程序,该应用程序在编译期间会抛出一些非常令人困惑的错误消息。我已将以下内容简化为能够重现错误的最少代码量。
我有一个接口和两个抽象类:
interface Player {
fun play()
}
abstract class Device <T : Player> {
abstract fun getPlayer(): T
}
abstract class DeviceFactory {
abstract fun <T : Player> create(): Device<T>
}
当我尝试创建一个实现DeviceFactory的类时出现问题:
class MyDeviceFactory : DeviceFactory() {
class MyPlayer : Player {
override fun play() {
println("[sound plays here]")
}
}
class MyDevice : Device<MyPlayer>() {
override fun getPlayer() = MyPlayer()
}
override fun create() = MyDevice()
}
最后一行代码是问题出现的地方,产生以下错误消息:
冲突重载:public open fun create(): MyDeviceFactory.MyDevice 定义在 MyDeviceFactory, public abstract fun create(): DeviceFactory中定义的设备
认为问题可能是缺少类型参数,我尝试了这个:
override fun <T : Player> create() = MyDevice()
现在我收到一条不同的错误消息:
“create”的返回类型不是被覆盖成员的返回类型的子类型 'public abstract fun create(): DeviceFactory 中定义的设备'这没有意义——MyDevice 是Device<T> 的子类型,对吧?可以肯定的是,我尝试明确返回类型:
override fun <T : Player> create(): Device<T> = MyDevice()
没有骰子:
类型不匹配:推断的类型是 MyDeviceFactory.MyDevice 但需要设备
如何创建一个派生自DeviceFactory 并返回MyDevice 实例的类?
【问题讨论】:
标签: kotlin generics type-parameter