2013-07-22 10 views
6

i mit Java bin neu und haben 2 Fragen zu dem folgenden Code:Java: Erhalten die Unterklasse von einer übergeordneten Klasse Liste

class Animal { } 
class Dog extends Animal { } 
class Cat extends Animal { } 
class Rat extends Animal { } 

class Main { 
    List<Animal> animals = new ArrayList<Animal>(); 

    public void main(String[] args) { 
    animals.add(new Dog()); 
    animals.add(new Rat()); 
    animals.add(new Dog()); 
    animals.add(new Cat()); 
    animals.add(new Rat()); 
    animals.add(new Cat()); 

    List<Animal> cats = getCertainAnimals(/*some parameter specifying that i want only the cat instances*/); 
    } 
} 

1) Gibt es eine Möglichkeit, entweder den Hund oder Katze Instanzen von dem zu bekommen Aminale Liste? 2) Wenn ja, wie sollte ich die Methode getCertainAnimals korrekt erstellen?

+1

Verwenden Sie instanceof-Operator http://www.javapractices.com/topic/TopicAction.do?Id=31. – kosa

+1

benutze instanceOf(), um den Typ einer Klasse zu bekommen :) – Satya

Antwort

4
Animal a = animals.get(i); 

if (a instanceof Cat) 
{ 
    Cat c = (Cat) a; 
} 
else if (a instanceof Dog) 
{ 
    Dog d = (Dog) a; 
} 

NB: Es wird kompilieren, wenn Sie instanceof nicht verwenden, aber es wird auch ermöglicht es Ihnen a-Cat oder Dog zu werfen, auch wenn die a ein Rat sind. Trotz der Kompilierung erhalten Sie eine ClassCastException zur Laufzeit. Stellen Sie sicher, dass Sie instanceof verwenden.

+1

Danke, es hat mir sehr geholfen! – user2605421

+1

Kein Problem. Willkommen bei SO. Sie sollten die [Tour] (http://stackoverflow.com/about) nehmen. –

2

Sie können so etwas wie die folgenden

List<Animal> animalList = new ArrayList<Animal>(); 
    animalList.add(new Dog()); 
    animalList.add(new Cat()); 
    for(Animal animal : animalList) { 
     if(animal instanceof Dog) { 
      System.out.println("Animal is a Dog"); 
     } 
     else if(animal instanceof Cat) {; 
      System.out.println("Animal is a Cat"); 
     } 
     else { 
      System.out.println("Not a known animal." + animal.getClass() + " must extend class Animal"); 
     } 
    } 

Sie können auch überprüfen, für die Klasse des Tieres tun und vergleichen Sie es mit Klassen Tierunter. Wie in

for(Animal animal : animalList) { 
    if(animal.getClass().equals(Dog.class)) { 
     System.out.println("Animal is a Dog"); 
    } 
    else if(animal.getClass().equals(Cat.class)) {; 
     System.out.println("Animal is a Cat"); 
    } 
    else { 
     System.out.println("Not a known animal." + animal.getClass() + " must extend class Animal"); 
    } 
} 

In beiden Fällen müssen Sie die Ausgänge als

Animal is a Dog 
Animal is a Cat 

bekommen Grundsätzlich tun beide das Gleiche. Nur um Ihnen ein besseres Verständnis zu geben.

Verwandte Themen