2014-02-09 3 views
0

Я следующие классы:Проверьте наличие подкласса в Java

Class Dog extends Animal 
Class Cat extends Animal 
Class Mouse extends Animal 

Кроме того, у меня есть List, в котором я ставлю каждый Animal, независимо от подкласса:

List<? extends Animal> list = new ArrayList<? extends Animal>(); 

Заполнение указанного списка с Dogs, Cats и Mice работает отлично, если я не хочу позже проверить, что такое Animal, есть внутри списка.

for (Animal animal: list) { 
    if (animal instanceof Dog) { 
     //do some dog stuff 
    } 
    if (animal instanceof Cat) { 
     // do some cat stuff 
    }  
} 

Как я могу проверить каждое животное в списке, будь то собака, кошка или мышь?

+3

Вы должны использовать полиморфизм (то есть переопределенные методы), чтобы избежать необходимости выполнять проверки 'instanceof'. –

+0

Какой «чек» вы хотите? Вы хотите класс или вам комфортно со String? – Makoto

+0

Я хотел бы знать, с каким животным я сейчас работаю, чтобы я мог запускать конкретный код для каждого животного, то есть собаку, кошку и мышь. Я думаю, что хочу знать класс. – Calius

ответ

0

Если вы хотите, чтобы избежать нескольких instanceof проверки, вы могли бы Dog, Cat и Mouse вытекают из общего суперкласса Mammal (который сам по себе был бы подкласс Animal). Тогда у вас есть только проверить:

 
if (animal instanceof Mammal) { } 

очиститель решение будет перемещать обработку в метод, который вы переопределить для каждого типа Animal:

 
abstract class Animal 
{ 
    public abstract void feed(); 
} 

class Dog extends Animal 
{ 
    public void feed() 
    { 
     // feed the dog 
    } 
} 

+0

замечательный. я бы пометил этот ответ как код-троллинг, если бы ответы могли быть помечены :) – luksch

+0

whoops ... я думаю, теперь ответ получил вторую часть, которая фактически имеет дело с OPs promlem ... Извините, что неверно истолковал вашу первую попытку. – luksch

0

Wildcards, такие как <? extends Animal> полезны, когда ваш список содержит элементы производного типа (т. Е. Cat/Dog и т. Д.), , но вы не знаете, что это такое. Они сделаны так, что они соответствуют ArrayList<Dog> или ArrayList<Cat> и т. Д., Когда вы работаете с ними в общих чертах в методах.

Но так как вы, кажется, добавляя все виды элементов в списке, вы очень хорошо прочь с ArrayList <Animal>, в котором вы могли бы добавить Dog с, Cat с или что у вас, потому что они являются производными от Animal и, следовательно, они являютсяAnimal s.

Вместо проверок instanceof я бы рекомендовал добавить в суперкласс класс полиморфного метода и переопределить его во всех подклассах, чтобы впоследствии вы могли его вызвать, не заботясь о том, какой тип является фактическим объектом.

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