在Object的ArrayList中,如何将Object转换为ArrayList中包含的3个类实例之一?

时间:2013-08-04 23:24:11

标签: java object arraylist

我正在做一个简单的Zoo应用程序来理解Java中的面向对象概念。

我的模型如下: 1)动物园有许多笼子 2)Cage有猫科动物,灵长类动物或鸟类的混合物 3)动物可以吃,睡或喝 4)猫延伸动物(做多余的猫的东西) 5)灵长类动物延伸动物(做额外灵长类动物的东西) 6)鸟类延伸动物(做多余鸟类)

问题:

虽然在动物园(Cage的ArrayList)中处理x个笼子非常容易,但我正在与笼中的动物挣扎。 我发现我需要一个ObjectList的ArrayList。

到目前为止一切都那么好,但是当我试图让我的动物回来并让他抓一个帖子时,它不再是猫科动物了,它是一个物体。

public class Cage{

        private String name;
        private ArrayList<Object> animals = new ArrayList<Object>();

        public Cage(String name){
            this.name = name;
        }

        public void addFeline(String name){
            Feline newFeline= new Feline(name);
            this.animals.add(newFeline);
        }

        public void addPrimate(String name){
            Primate newPrimate= new Primate(name);
            this.animals.add(newPrimate);
        }

        public void addBird(String name){
            Bird newBird= new Bird(name);
            this.animals.add(newBird);
        }

        public void removeAnimal(int index){
            this.animals.remove(index);
        }

        public Object getAnimal(int index){
            Object myAnimal = this.animals.get(index);
            return myAnimal;
        }
    }

我称之为:

Zoo myZoo = new Zoo("My Zoo");
myZoo.addCage("Monkey Exhibit");
Cage myCage = myZoo.getCage(0);
myCage.addFeline("Leo");
Object MyAnimal = myCage.getAnimal(0);

问题:我怎样才能将对象变回Feline类的实例,以便它可以抓一个帖子?

4 个答案:

答案 0 :(得分:3)

我认为解决此问题的最佳方法是使用策略设计模式。

Feline,Primate和Bird应该实现一个界面Animal。然后,Cage会有一个方法public void addAnimal(Animal animal);

猫科动物,灵长类动物和鸟类的物体创造应该在凯奇之外。

如果这可以提供帮助,我已经汇总了一些代码。我会将应用程序设计为类似于下面的内容。

应使用接口封装行为。例如EatingBehaviour

public interface Animal {
    public String getName();
}
public interface EatingBehaviour {
    public void howManyTimes();
}

public class RealLionEatingBehaviour implements EatingBehaviour{
    @Override
    public void howManyTimes() {
        System.out.println("I eat once a day");
    }
}

public class ToyLionEatingBehaviour implements EatingBehaviour {
    @Override
    public void howManyTimes() {
        System.out.println("I never eat! I am a toy lion.");
    }
}

public abstract class Feline implements Animal{
    public abstract void scratchPost();
    private EatingBehaviour eatingBehaviour;
    public EatingBehaviour getEatingBehaviour() {
        return eatingBehaviour;
    }
    public void setEatingBehaviour(EatingBehaviour eatingBehaviour) {
        this.eatingBehaviour = eatingBehaviour;
    }
}

public class Lion extends Feline {
    private String name;
    public String getName() {
        return this.name; 
    }
    public void setName(String name) {
        this.name = name; 
    }
    Lion (String name) {
        this.name=name;
    }
    public void scratchPost(){
        System.out.println(getName() + " Lion Scratching Post!");
    }   
}

public class AnimalFactory {
    public static Animal getAnimalInstance(String type, String name){
        Animal animal=null;
        if ("lion".equalsIgnoreCase(type)) {
            animal = new Lion(name);
        }
        return animal;
    }
}

import java.util.ArrayList;
import java.util.List;

public class Cage {
    private List<Animal> animals = new ArrayList<Animal>();
    public void addAnimal(Animal animal) {
        animals.add(animal);
    }
    public void removeAnimal(int index){
        this.animals.remove(index);
    }
    public Animal getAnimal(int index){
        return this.animals.get(index);
    }   
}

public class Zoo {
    public static void main(String args[]) {
        Cage cage = new Cage();
        Animal animal = null;
        animal = AnimalFactory.getAnimalInstance("Lion", "Sweety");
        cage.addAnimal(animal);
        Animal animalFromCage = cage.getAnimal(0);
        if (animalFromCage instanceof Feline) {
            Feline feline = (Feline) animalFromCage;
            feline.setEatingBehaviour(new RealLionEatingBehaviour());
            feline.scratchPost();
            feline.getEatingBehaviour().howManyTimes();
            feline.setEatingBehaviour(new ToyLionEatingBehaviour());
            feline.getEatingBehaviour().howManyTimes();
        }
    }
} 

答案 1 :(得分:2)

使用演员:

Object myAnimal = myCage.getAnimal(0);
Feline f = (Feline) myAnimal;

答案 2 :(得分:0)

private List<Animal> animals = new ArrayList<Animal>();
    public void findAnimal(int index) {
        Animal myAnimal = animals.get(index);
        if (myAnimal instanceof Feline) {
            Feline feline = (Feline) myAnimal;
            //do the work with Feline
        } else if (myAnimal instanceof Primate) {
            //do the work with Primate
        }
        // continue with the other types.
    }

这将避免意外的转播异常。由于您知道类型使用Arraylist中的超类型(Animal)而不是对象。如果是Obejct,你可以向List添加任何内容。

答案 3 :(得分:-1)

您应该使用ArrayList<? extends Animal>代替ArrayList<Object>。然后,您将返回值转换为Animal的相应子类。