我目前有一个继承层次结构,如下所示:
abstract class Foo {
protected open var elem: Bar<out Foo>? = null
}
class Baz<T : Foo> : Foo {
override var elem: Bar<out T>? = null
}
但是,尝试使用此代码时出现以下错误
Var-property is Bar<out T>?, which is not a type of overriden protected open var elem: Bar<out Foo>? defined in Foo
我也尝试过以下类型:
abstract class Foo {
protected open var elem: Bar<*>? = null
}
class Baz<T : Foo> : Foo {
override var elem: Bar<out T>? = null
}
以及:
abstract class Foo {
protected open var elem: Bar<Foo>? = null
}
class Baz<T : Foo> : Foo {
override var elem: Bar<T>? = null
}
但是,在每种情况下,我仍然会收到类似的错误消息。我知道在Java中,您可以使用更特定的泛型类型覆盖继承的变量。我对Kotlin不太熟悉,只是最近才了解到声明位置的差异,因此有人可以解释一下这是怎么回事吗?
为可变属性定义更具体的类型将破坏继承和多态性规则。例如,假设它将编译:
class A
class B : A
abstract class Foo {
protected open var elem: Bar<out A>? = null
}
class Baz : Foo {
override var elem: Bar<out B>? = null
}
那我们有
val foo: Foo = Baz()
val producerOfA: Bar<out A> = foo.elem
这是正确的,该变量需要一个生产者A
并获得一个(指定类型为Bar<out A>
,实际类型为Bar<out B>
,这是子类型)
具有相同的声明:
foo.elem = Bar<out A>()
这是不正确的,setter期望一个的生产者A
并得到一个,但是object的基础类型foo
是Baz()
仅接受B
(Bar<out B>
)的生产者,当然,的生产者A
并不总是为的生产者B
。
希望这可以解决问题。您可以通过声明不可变的属性(val
而不是而不是var
)来使其编译,但这是特定于用例的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句