【问题标题】:Conceptual difference between parametric polymorphism and subtype polymorphism?参数多态性和亚型多态性之间的概念区别?
【发布时间】:2014-05-06 22:07:08
【问题描述】:

我试图通读维基百科,但它在多态性(特别是与 Java 相关)的主题上非常密集。我的理解是子类型多态性与子类型化有关,而参数多态性与跨不同对象/类泛化的方法有关?我错过了什么?

【问题讨论】:

    标签: java polymorphism


    【解决方案1】:

    As the article says,

    参数多态性允许一个函数或一个数据类型被通用编写,这样它就可以相同地处理值而不依赖于它们的类型......参数多态性也可用于几种面向对象的语言,它通常以“泛型”(例如 Java)或“模板”(C++ 和 D)的名称命名

    所以这意味着(例如)你可以创建一个函数来获取 somethings 的列表,并且无论这些 somethings 是什么,该函数都可以工作.考虑一个返回集合中元素数量的方法。您可以传入任何类型元素的列表,它会返回一个答案。您不必为传入的每种列表重写函数。

    某些语言采用子类型化的思想来限制可用于特定多态性情况的类型范围。在这些语言中,子类型多态性(有时称为包含多态性或动态多态性[需要引用])允许编写函数来获取特定类型 T 的对象,但如果通过了也可以正常工作属于类型 S 的对象,类型 S 是 T 的子类型

    换句话说,您可以有一个将 Animal 作为参数的方法,但您也可以将 Cat 或 Dog 传入其中,因为 Cats 和 Dogs 是动物。

    【讨论】:

      【解决方案2】:

      您可以在 JDK 中找到示例。

      参数多态示例:

      public static <T> void sort(T[] a, Comparator<? super T> c) {
         ...
      }
      

      方法接受任何类型 T 并且可以相同地处理它:

      Arrays.sort(new String[]{"a", "1"}, new Comparator<String>() { ... });
      

      子类型多态性示例:

      Executors.newSingleThreadExecutor().submit(runable);
      

      这里ExecutorService 并不关心Runable 的实际实现,它只需要它可以运行的东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多