2013-07-22 12 views
6

io sono nuovo con Java e hanno 2 domande sul seguente codice:Java: Ottenere la sottoclasse da un elenco superclasse

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) C'è un modo per ottenere le istanze sia il cane o il gatto dalla Lista di Aminal? 2) Se sì, come dovrei compilare correttamente il metodo getCertainAnimals?

+1

Utilizzare l'operatore instanceof http://www.javapractices.com/topic/TopicAction.do?Id=31. – kosa

+1

usa instanceOf(), per ottenere il tipo di una classe :) – Satya

risposta

4
Animal a = animals.get(i); 

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

NB: compilerà se non si utilizza instanceof, ma permetterà anche di lanciare a-Cat o Dog, anche se il a è un Rat. Nonostante la compilazione, riceverai un ClassCastException in fase di runtime. Quindi, assicurati di utilizzare instanceof.

+1

Grazie, mi ha aiutato molto! – user2605421

+1

Nessun problema. Benvenuti in SO. Dovresti fare il [tour] (http://stackoverflow.com/about). –

2

Si può fare qualcosa di simile al seguente

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

È inoltre possibile controllare per la classe dell'animale e confrontarlo con le classi secondarie degli animali. Come 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 entrambi i casi si ottengono le uscite come

Animal is a Dog 
Animal is a Cat 

Fondamentalmente entrambi fanno la stessa cosa. Solo per darti una migliore comprensione