4

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

4

4 回答 4

3

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

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

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

例如,想象三个类

public class Animal

public class Dog extends Animal

public class Cat extends Animal

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

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

于 2012-12-20T11:23:23.750 回答
3

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

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

关于你的问题

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

于 2012-12-20T11:26:07.570 回答
2

多态性不能应用于泛型类型。虽然Stringextends ObjectArrayList<Object>但不能用来指代ArrayList<String>

Object obj = new String(); // OK
ArrayList<Object> list = new  ArrayList<String>(); // Not OK
于 2012-12-20T11:22:16.100 回答
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 ,可能有更好的界面可以设计或使用以满足您的需要。

于 2012-12-20T11:43:18.530 回答