2016-05-23 2 views
0

У меня 5 классов:Родового ArrayList с несколькими параметрами (классов) с собственным методом добавления

  • Ant {абстрактный},
  • работника распространяется Ant,
  • солдата распространяется Ant,
  • Королева проходит Ant,

  • Муравейник

    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)); 

    } 

Проблема заключается в том, что я хочу, чтобы добавить любой вид муравьев (Солдат, Королева, работник) в ArrayList, используя свой собственный public void adde(T ant) метод.

Я получаю сообщение об ошибке, что метод adde (Worker) не определен для типа ArrayList.

Есть ли у кого-нибудь идеи, как это решить? Он работает только при использовании метода add(), но я должен использовать свой собственный.

+3

Вы должны были бы назвать 'adde' на' Anthill', а не 'ArrayList'. Это не имеет ничего общего с дженериками. –

+2

Я также не вижу причин, по которым '' 'Anthill''' был бы общим классом, если вы не планируете иметь' '' Anthill'' '', которые имеют только '' 'Worker'' или только '' 'Queen'''s. –

+0

Вам вообще не нужны общие обозначения для вашего класса. – mdewit

ответ

0

Проблема заключается в том, что я хочу добавить в ArrayList любые муравьи (Солдат, Королева, Рабочий), используя свой собственный метод public void adde (T ant).

Я предполагаю, что вы хотите добавить элементы в ArrayList antHill, определенные в классе Anthill. Причина моих предположений заключается в том, что кажется, что вы хотите сохранить количество «населения» Anthill и если в нем есть королева.

Я получаю сообщение об ошибке, что метод adde (Worker) не определен для типа ArrayList.

для вызова метода adde из класса муравейника, вы должны сначала создать экземпляр класса, чтобы вызвать метод adde на объекте только что создал. Поскольку экземпляр ArrayList не является экземпляром Anthill, вы не можете вызывать метод Anthill в экземпляре ArrayList.

Есть ли у кого-нибудь идеи, как это решить? Он работает только при использовании метода add(), но я должен использовать свой собственный.

для самого класса муравейнике вы не можете использовать дженерики, потому что это приведет к экземплярам класса муравейников на только рабочий или солдат или Королева элементов, и, конечно, не будет содержать сразу все типы, полученные из класса Ant но только один. Кроме того, параметр adde метода ant в public void adde(T ant) должен быть супертипа Ant, поэтому вы можете передать любой подтип этому методу.

Далее в основном методе создайте экземпляр 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)); 

     } 
    } 
} 
+0

Предлагаю прочитать и использовать с помощью [Учебники Java] (https://docs.oracle.com/javase/tutorial/) для ссылки на языковые структуры и варианты использования, соглашения об именах и научиться эффективному использованию языка , С уважением –