多态性、ArrayList 和对象

Polymorphism, ArrayList, and Objects

这是一个比较笼统的问题。我试图在创建高效程序或至少是工作程序时理解多态性的概念。

该程序将添加、删除、搜索和显示植物。

假设我必须创建一个超级 class 植物和三种不同的植物(花、真菌、杂草)以从植物延伸。

问题: 我希望能够创建一个工厂 ArrayList 或 Array。 那可能吗? 或者最合乎逻辑的做法是什么?

上面的代码只是为了说明我的观点。无论如何都不正确。

class Plant{
//atributes
//constructor
//setters and getters
}


class Flower extends Plant{
//with some different attributes
}


class Fungus extends Plant{
//with some different attributes
}

class Weed extends Plant{
// with some different attributes
}


public class PlantList{
public static void main(String[] args){

//HERE is where I'm confused

ArrayList<Plant> plantList= new ArrayList<Plant>(); 


// OR

Plant plantList= new Plant[25];

plantList[0] = new Flower();
plantList[1] = new weed();
plantList[2] = new fungus();

//or completely way off?

//add()
//remove ()
//search()
//display()

}

有人可以向我解释如何将不同类型的植物树添加到 Array 或 ArrayList 中吗?

您可以将对 Plant 的任何子类实例的引用存储在 Plant[] 数组或 ArrayList<Plant> 中。

数组是表示固定大小集合的一种方式。您的示例说明了如何将 Plant 引用放入数组中。

ArrayList<Plant> 支持一个集合,其大小可以根据需要改变。您可以使用多种方法将 Plant 引用放入其中,包括 add() 方法:

 plantList.add( new Flower() );

顺便说一句,在 Java 中习惯用首字母大写字符命名所有 类。

默认情况下,您可以将任何对象放入列表中,但是从 Java 5 开始,Java泛型可以限制您可以插入列表中的对象类型。

List<Plant> list = new ArrayList<Plant>();

此列表现在只能插入 Plant 实例。而这就是数组之间的多态性。

关于这个主题的一个恼人的方面是,尽管 FlowerPlant 的子类型,但这并不意味着 ArrayList<Flower>ArrayList<Plant> 的子类型。

你能做的是

List<Plant> list = new ArrayList<Plant>();

然后

Plant flower1 = new Flower();

Plant weed1 = new Weed();

list.add(flower1);
list.add(weed1);

泛型的重点是添加编译时类型安全,这样就可以回答为什么第二种方法不是类型安全。