Java 中的多态表示可以通过覆盖子类方法来实现的多种形式。关于允许传入泛型值的泛型,例如ArrayList<Object>
. 那是多态性概念的一部分吗?干杯
4 回答
泛型和多态是两个不同的东西。
泛型主要用于指定预期的类型。您可以使用通配符来定义一系列类型。例如<? extends List>
可以适用于任何类型的 List ( LinkedList
, ArrayList
)
多态性是一个对象可以有多种类型的概念。所以一个对象可以是List的一个实例,也可以是一个实例ArrayList
。
例如,想象三个类
public class Animal
public class Dog extends Animal
public class Cat extends Animal
如果您有 的实例Dog
,则该对象既是 又Dog
是Animal
。
显然,这两者很好地结合在一起,就好像您定义了一个ArrayList<Object>
然后您可以将任何添加Object
到该列表中(这是 Java 中的任何类)
java中的多态可以通过java中的两种方式来实现。
- 静态(重载 - 编译时)
- 动态(覆盖 - 运行时)
关于你的问题
是的,它可以通过覆盖子类中的方法来完成。您可以在重载和覆盖中的参数中使用泛型对象。
多态性不能应用于泛型类型。虽然String
extends Object
,ArrayList<Object>
但不能用来指代ArrayList<String>
Object obj = new String(); // OK
ArrayList<Object> list = new ArrayList<String>(); // Not OK
使用 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 ,可能有更好的界面可以设计或使用以满足您的需要。