Java中的Polymorphisim代表了通过重写子类方法可以实现的许多形式。关于允许传递通用值的泛型,例如ArrayList<Object>
。这是多态性概念的一部分吗?
干杯
答案 0 :(得分:3)
泛型和多态是两回事。
泛型主要用于指定预期的类型。您可以使用通配符来定义一系列类型。例如。 <? extends 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中的任何类)
答案 1 :(得分:3)
java中的多态性可以通过java中的两种方式实现。
关于你的问题
是的,可以通过重写子类中的方法来完成。您也可以在重载和覆盖的参数中使用genrics对象。
答案 2 :(得分:2)
Polymorhphism不能应用于泛型类型。
虽然String
延伸Object
,但ArrayList<Object>
不能用于引用ArrayList<String>
Object obj = new String(); // OK
ArrayList<Object> list = new ArrayList<String>(); // Not OK
答案 3 :(得分:1)
使用Object for polymorphism在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,可能有一个更好的界面,您可以根据需要设计或使用它。