跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 分享一个关于协变、逆变、不变的优秀回答
未分類
10 11 月 2020

分享一个关于协变、逆变、不变的优秀回答

分享一个关于协变、逆变、不变的优秀回答

資深大佬 : JasonLaw 8

之前对于这几个概念没有一个深入的理解,这个回答真的解释得太好了。

关于数组是协变的,Jon Skeet 在Is List<Dog> a subclass of List<Animal>? Why are Java generics not implicitly polymorphic? – Stack Overflow中有这么一个评论。

大佬有話說 (5)

  • 資深大佬 : sunjourney

    这不算解释吧,原因在于数据是否有可变性

  • 資深大佬 : no1xsyzy

    只有将类型作为参量(包括泛型)才有协变逆变之说
    假定一个函数签名为 f: A -> B
    A 对于 f 是逆变的,因为对于任何 A 的父类 C,g: C -> B 可以和 f 一样被使用
    B 对于 f 是协变的,因为对于任何 B 的子类 D,h: A -> D 可以和 f 一样被使用
    而如果是 List 这个具有泛型的类,因为它的 “范畴”(记得面向对象是范畴论的近似)既包含了列表取元素的 ref: A[] -> A,又包含了元素构造列表的 list: A -> A[],甚至包含了尾部添加元素的 append: A[] -> A -> A[] 和头部添加元素的 prepend: A -> A[] -> A[],那 A 对于 A[] 既不总是协变的,也不总是逆变的,那就是不变的。

    而即使底层实现了类似的结构,如果是只出不进的队列,那 A 对于 QueueOut 是协变的,只进不出的队列,A 对于 QueueIn 是逆变的。
    (这似乎和 traits 有点类似?接口的某些子集达成协变,某些子集达成逆变,合在一起就成了不变)

    整套 OO 体系是混乱的。
    滥用继承。
    希望来点只能进行包裹、静态鸭子语言的 OO 语言。
    顺便这需要语法糖来快速实现 this.some_method = this.wrapped_object.method
    `convey wrapped_object.method as some_method`

  • 主 資深大佬 : JasonLaw

    @sunjourney #1 数据是否有可变性?

  • 主 資深大佬 : JasonLaw

    @no1xsyzy #2 完全看不懂你所说的

  • 資深大佬 : aguesuka

    既然选择了 java 就不要纠结这种东西,java 不是依赖类型的语言。泛型边界是对代码可读性的毁灭打击

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具