【问题标题】:Regarding polymorphic bevaviour关于多态行为
【发布时间】:2023-12-29 00:10:02
【问题描述】:

Java 中的多态表示可以通过覆盖子类方法来实现的多种形式。关于允许传入泛型值的泛型,例如ArrayList<Object>。那是多态性概念的一部分吗? 干杯

【问题讨论】:

标签: java polymorphism overriding


【解决方案1】:

使用 Object 进行多态性在 Java 中被认为是一种不好的模式。它不会为您提供接口所提供的保证和类型安全。

List<Object> animals = new ArrayList<Object>();
animals.add(new Sheep());
animals.add(new Cat());
// This will throw us an error! (ClassCastException)
Cat cat = (Cat) animals.get(0)

上面演示的错误不能在编译时捕获,只有在运行时发生错误时才会抛出。如果我们创建了 Animal 接口,我们可以完全避免这个错误。

interface Animal {
     //other methods you need to hide through polymorphism
     void sound();
}
List<Animal> animals = new ArrayList<Animal>();
// Sheep and Cat implement the Animal interface
animals.add(new Sheep());
animals.add(new Cat());
// No error
Animal animal = animals.get(0)
// This will through a COMPILE TIME error
Cat cat = animal.get(1);

这显示了一种尝试实现多态性的更好方法,我们创建了一种更安全的方法,可以在编译时而不是运行时进行检查。尽量避免使用 Object,可能有更好的接口可以设计或使用以满足您的需要。

【讨论】:

    【解决方案2】:

    java中的多态可以通过java中的两种方式实现。

    1. 静态(重载 - 编译时)
    2. 动态(覆盖 - 运行时)

    关于你的问题

    是的,它可以通过覆盖子类中的方法来完成。您可以在重载和覆盖中的参数中使用泛型对象。

    【讨论】:

      【解决方案3】:

      泛型和多态是两个不同的东西。

      泛型主要用于指定预期的类型。您可以使用通配符来定义一系列类型。例如。 &lt;? extends List&gt; 可以适用于任何类型的 List (LinkedList, ArrayList)

      多态是一个对象可以有多种类型的概念。所以一个对象可以是List的实例,也可以是ArrayList的实例。

      例如,想象三个类

      public class Animal
      
      public class Dog extends Animal
      
      public class Cat extends Animal
      

      如果您有 Dog 的实例,则该对象既是 Dog 又是 Animal

      显然,这两者很好地结合在一起,就像您定义了一个 ArrayList&lt;Object&gt; 然后您可以将任何 Object 添加到该列表中(这是 Java 中的任何类)

      【讨论】:

        【解决方案4】:

        多态不能应用于泛型类型。 虽然String 扩展了Object,但ArrayList&lt;Object&gt; 不能用于引用ArrayList&lt;String&gt;

        Object obj = new String(); // OK
        ArrayList<Object> list = new  ArrayList<String>(); // Not OK
        

        【讨论】:

        • 许多人倾向于从面向对象编程模型的角度来考虑多态性,但事实是多态性是一个更广泛的概念,在其他编程范式中它以不同的方式实现。在 Haskell 或 SML 等函数式编程语言中,参数多态性是关键。 Java 泛型与它有很多相似之处。