具有多个参数(类)的通用ArrayList,具有自己的add方法

时间:2016-05-23 13:45:11

标签: java generics arraylist

我有5个班级:

  • Ant {abstract},
  • 工作人员扩展了Ant,
  • 士兵延伸Ant,
  • Queen扩展了Ant,

  • Anthill

    public class Anthill<T extends Ant> {
    
    ArrayList <Ant> antHill = new ArrayList<>();
    
    public void adde(T ant)
    {
    if(ant != null)
    {
        if (ant.isQueen() == true && amountOfQueens <= 1)
        {
                antHill.add(ant);
                amountOfQueens++;
    
        } 
            else if (ant.isQueen() == false) 
                {
                antHill.add(ant);
                amountOfAnts++;
                }
         else   
                    { 
                    System.out.println("Only one queen is permitted.");
                    }
    }
    
    }       
    

示例:

    import java.util.ArrayList;


    public class Main {

    public static void main(String [] args){

    ArrayList <Ant> antList = new ArrayList<>();

    for(int i = 1; i<6; i++){
        antList.adde(new Worker(6, "AW", 0, i));

    }

问题是我想使用我自己的public void adde(T ant)方法将任何类型的蚂蚁(士兵,女王,工人)添加到ArrayList中。

我得到的错误是方法adde(Worker)未定义类型ArrayList。

有谁知道如何解决这个问题?它仅在使用方法add()时有效,但我必须使用自己的方法。

1 个答案:

答案 0 :(得分:0)

  

问题是我想使用我自己的public void adde(T ant)方法将任何类型的蚂蚁(士兵,女王,工人)添加到ArrayList中。

我假设您要在Anthill类中定义的ArrayList antHill中添加元素。我的假设的原因是,你似乎想要计算蚁丘的“人口”数量,如果有一个女王的话。

  

我得到的错误是方法adde(Worker)未定义类型ArrayList。

要从Anthill类中调用方法adde,首先必须实例化该类,以便在刚创建的对象上调用方法adde。由于ArrayList实例不是Anthill实例,因此您无法在ArrayList实例上调用Anthill的方法。

  

有谁知道如何解决这个问题?它只在使用方法add()时才有效,但我必须使用自己的方法。

对于Anthill这个类本身你不能使用泛型,因为它会导致Anthills只有工人或士兵或女王元素的实例,并且当然不会包含从类Ant派生的所有类型但只有一个。此外,adde中的ant方法参数public void adde(T ant)必须是超类型Ant,因此您可以将任何子类型传递给该方法。

接下来在main方法中创建一个Anthill实例,并在方法ArrayList antList上调用它(不在adde中)。

它看起来像这样:

public class Anthill {

    ArrayList <Ant> antHill = new ArrayList<>();

    public void adde(Ant ant)
    {
        if(ant != null)
        {
        // Assuming ant.isQueen() returns a boolean.
        // amountOfQueens must be 0 to permit the insertion of max 1 Queen instance in the list
        if (ant.isQueen() && amountOfQueens == 0)
        {
            antHill.add(ant);
            amountOfQueens++;
        } 
        else if (ant.isQueen() == false) 
        {
            antHill.add(ant);
            amountOfAnts++;
        }
        else   
        { 
            System.out.println("Only one queen is permitted.");
        }
    }
}   

这里是Main.java:

import java.util.ArrayList;


public class Main {

    public static void main(String [] args)
    {

        Anthill antHill = new Anthill();

        for(int i = 1; i<6; i++)
        {
            antHill.adde(new Worker(6, "AW", 0, i));

        }
    }
}