2013-07-19 2 views
1

Скажем, у меня есть суперкласс «Animal» и подклассы «Cat», Dog, Bird ». Есть ли способ иметь массив типа подкласса, а не экземпляры класса, с которыми я смогу создавать экземпляры каждого из возможных ? подклассJava: как получить массив подкласса?

Для упрощения, я хочу это:

Pseudo code: For each possible subclass of "Animal": create an instance of that class. 

Как я могу это сделать

Edit: Я не хочу, массив экземпляров этих подклассов, я хочу массив тип объекта.

+0

Полиморфизм .... – DGomez

+1

неясно ваш вопрос – nachokk

+1

Это, кажется, домашняя работа или задание. –

ответ

1

После комментария ФП
НЕТ СПОСОБА ПОЛУЧИТЬ ВСЕ СУБТИПЫ КЛАССА даже используя отражение.
Но вы можете сделать это по-другому, вы можете сказать, что является единственным, но самым длинным способом.

  • Получить список имен всех классов, которые существуют на пути к классам
  • нагрузки каждого класса и тест, чтобы увидеть, если он является подклассом или реализатор желаемого класса или интерфейса



Ответ перед комментарием OP в

Поскольку ваш вопрос еще не ясен, но я думаю, вы хотите использовать массив или коллекцию, в которой будут храниться все экземпляры, даже если это экземпляр superclass или subclass.
Тогда, я думаю, вам нужно сделать вот так.

List<Object> list = new ArrayList<Object>(); 
     list.add(new Cat()); 
     list.add(new Dog()); 
     list.add(new Animal()); 
     list.add(new Cat()); 

     for (int i = 0; i < list.size(); i++) { 

      if(list.get(i) instanceof Cat){ 
       System.out.println("Cat at "+i); 
      }else if(list.get(i) instanceof Dog){ 
       System.out.println("Dog at "+i); 
      }else if(list.get(i) instanceof Animal){ 
       System.out.println("Animal at "+i); 
      } 
     } 

Этот код проверяется
Примечание: Имейте в виду, что не место проверки родительского класса, как и в случае примера кода (list.get(i) instanceof Animal) в верхней части, в противном случае она будет проходить оба случая (если чеки являются только if-if-if) или пропускают один случай (и всегда возвращают объект как Animal, если проверяются if-else if-else if) (list.get(i) instanceof Animal) и (list.get(i) instanceof Cat) Если возвращаемый объект является объектом Cat.

+0

Что я хочу - это массив типа объекта, который я могу использовать для создания объектов этих типов. Если это возможно, то есть. –

3

Вы можете использовать Ploymorphism для достижения этого.

Animal[] animalArray = new Animal[10]; 
animalArray[0] = new Dog(); 
animalArray[1] = new Cat(); 

В основном все подклассы класса животных. Если вы хотите, чтобы получить объекты, которые вы можете просто typecaset это

Dod dog = (Dog)animalArray[0]; 

Чтобы узнать метод, вы можете просто использовать GetClass() класса. Например,

Animal[] animalArray = new Animal[10]; 
    animalArray[0] = new Dog(); 
    System.out.println(animalArray[0].getClass()); 

будет печатать class Dog.

+0

@ Джейсон. Да, это правильно. Вы могли бы просто отредактировать его :) –

1

Как уже упоминалось в другом ответе, это невозможно, используя чисто отражение.

Если вы не можете настроить свои классы специально для этого случая, вам нужно будет погрузиться либо в итерацию по классам из загрузчика классов, либо с помощью специального загрузчика классов, который добавляет информацию во внутреннюю структуру данных, чтобы при он запрашивается позже, вам не нужно повторять все классы.

Предполагая, что вас не интересует погружение в код загрузчика классов (похоже, что это не так), следующий лучший способ сделать это - добавить статический код к вашим классам, который запускается во время загрузки класса. Например:

public class Animal { 
    protected static List subclasses = new ArrayList(); 
    //... 
} 

public class Cat extends Animal { 
    static { 
     subclasses.add(Cat.class); 
    } 
    //... 
} 

Это было бы по существу то, что вы могли бы сделать с пользовательским загрузчиком классов, где этот код будет жить в загрузчике класса вместо класса.

Повторите этот шаблон для всех подклассов. Затем, когда вы хотите создавать экземпляры, у вас есть ссылки на классы внутри списка subclasses, которые вы должны создать с помощью Class.newInstance (или другого подходящего метода отражения, если ваши конструкторы имеют аргументы).

Смежные вопросы