在Kotlin中覆盖超类的属性时,有没有办法声明更特定的泛型类型?

冶金

我目前有一个继承层次结构,如下所示:

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的基础类型fooBaz()仅接受BBar<out B>)的生产者,当然,的生产者A并不总是为的生产者B

希望这可以解决问题。您可以通过声明不可变的属性(val而不是而不是var来使其编译,但这是特定于用例的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有办法拥有更严格的泛函函数参数?

来自分类Dev

有没有办法使两个类使用相同的泛型?

来自分类Dev

有没有办法传递带有泛型参数的函数指针?

来自分类Dev

有没有办法从常规Kotlin类中识别出Kotlin数据类?

来自分类Dev

更改类中的属性时,有没有办法使didSet起作用?

来自分类Dev

有没有办法打印当前类中复合数据类型的所有属性

来自分类Dev

有没有办法在TypeScript中实例化受约束的泛型类型的实例?

来自分类Dev

有没有办法将输入类型包装到C ++中的模板类?

来自分类Dev

有没有办法从其完整类型中获取模板类的类型?

来自分类Dev

有没有办法在Python中覆盖现有(系统)类上的方法?

来自分类Dev

有没有办法从列表中获取具有特定属性的所有项目

来自分类Dev

有没有办法在另一个抽象类中使用抽象泛型类?

来自分类Dev

有没有办法在基类的函数中获取派生类的类型?

来自分类Dev

有没有办法接受Kotlin中类型A或B的参数?

来自分类Dev

有没有办法为特定的HashSet或HashMap覆盖类型的相等和哈希函数?

来自分类Dev

泛型:有没有办法让编译器检查T是否是特定的UIView子类?

来自分类Dev

有没有办法从Java的派生类访问嵌套在超类中的私有内部类?

来自分类Dev

当从Python中的特定父类派生一个类时,有没有办法使代码运行?

来自分类Dev

有没有办法在没有泛型的情况下确保Java在编译时的类型安全

来自分类Dev

有没有办法在方法声明中定义两个泛型类型

来自分类Dev

有没有更简洁的方法来设置泛型类的属性?

来自分类Dev

当 Swift 中满足特定条件时,有没有办法结束递归方法?

来自分类Dev

有没有办法检查使用泛型使用什么变量类型?

来自分类Dev

有没有办法声明作为派生类类型的抽象基类的成员?

来自分类Dev

有没有办法覆盖 Mockito 中的 doReturn?

来自分类Dev

有没有办法在 Kotlin 中获取继承接口(或另一个类)的对象类型?

来自分类Dev

C# 有没有办法将 DllImport 与泛型方法类型一起使用?

来自分类Dev

es6 导入。有没有办法在“泛型”中使用“命名空间”作为“类”?

来自分类Dev

有没有办法从其属性推断泛型参数?

Related 相关文章

  1. 1

    有没有办法拥有更严格的泛函函数参数?

  2. 2

    有没有办法使两个类使用相同的泛型?

  3. 3

    有没有办法传递带有泛型参数的函数指针?

  4. 4

    有没有办法从常规Kotlin类中识别出Kotlin数据类?

  5. 5

    更改类中的属性时,有没有办法使didSet起作用?

  6. 6

    有没有办法打印当前类中复合数据类型的所有属性

  7. 7

    有没有办法在TypeScript中实例化受约束的泛型类型的实例?

  8. 8

    有没有办法将输入类型包装到C ++中的模板类?

  9. 9

    有没有办法从其完整类型中获取模板类的类型?

  10. 10

    有没有办法在Python中覆盖现有(系统)类上的方法?

  11. 11

    有没有办法从列表中获取具有特定属性的所有项目

  12. 12

    有没有办法在另一个抽象类中使用抽象泛型类?

  13. 13

    有没有办法在基类的函数中获取派生类的类型?

  14. 14

    有没有办法接受Kotlin中类型A或B的参数?

  15. 15

    有没有办法为特定的HashSet或HashMap覆盖类型的相等和哈希函数?

  16. 16

    泛型:有没有办法让编译器检查T是否是特定的UIView子类?

  17. 17

    有没有办法从Java的派生类访问嵌套在超类中的私有内部类?

  18. 18

    当从Python中的特定父类派生一个类时,有没有办法使代码运行?

  19. 19

    有没有办法在没有泛型的情况下确保Java在编译时的类型安全

  20. 20

    有没有办法在方法声明中定义两个泛型类型

  21. 21

    有没有更简洁的方法来设置泛型类的属性?

  22. 22

    当 Swift 中满足特定条件时,有没有办法结束递归方法?

  23. 23

    有没有办法检查使用泛型使用什么变量类型?

  24. 24

    有没有办法声明作为派生类类型的抽象基类的成员?

  25. 25

    有没有办法覆盖 Mockito 中的 doReturn?

  26. 26

    有没有办法在 Kotlin 中获取继承接口(或另一个类)的对象类型?

  27. 27

    C# 有没有办法将 DllImport 与泛型方法类型一起使用?

  28. 28

    es6 导入。有没有办法在“泛型”中使用“命名空间”作为“类”?

  29. 29

    有没有办法从其属性推断泛型参数?

热门标签

归档