我可以在不继承对象类的情况下调用对象方法吗?

时间:2018-09-11 09:02:34

标签: java collections

我在Zoo.java中实现了一个不继承任何其他类的数组列表,我将为此添加一些对象

ArrayList al = new ArrayList(); 
al.add(new Cat());
al.add(new Dog()); 

我无法编写逻辑来告诉我要调用哪种类型的对象,以及不使用继承和泛型而使用该类的方法。

所以我可以在这里使用:

                   for(Animal a:al)
                   class <?> X = obj.getClass(a);
                   ((X)a).somemethod();

4 个答案:

答案 0 :(得分:1)

您可以创建超类类型的数组列表。

您可以这样做。

ArrayList<Zoo> arrayList=new ArrayList<Zoo>();

答案 1 :(得分:1)

这里要学习的课程是“多态”。

CatDog应该实现一个通用的接口,该接口声明对它们可用的方法:

interface Animal {
   void eat(SomeOtherInterface food);
   void giveSound(BufferedWriter output);
   void move();
}

class Cat implements Animal {
   @Override public void eat(SomeOtherInterface food){
        // consume the food
   }
   @Override public void giveSound(BufferedWriter output){
        output.write("Meaw");
   }
   @Override public void move(){
      // move within the world
   }
}

class Dog implements Animal {
   @Override public void eat(SomeOtherInterface food){
        // consume the food
   }
   @Override public void giveSound(BufferedWriter output){
        output.write("Woof");
   }
   @Override public void move(){
      // move within the world
   }
}

然后为集合提供最通用的通用类型的 generics 参数,以提供您要访问的方法:

Collection<Animal> myAnimals = new ArrayList();
myAnimals.add(new Cat());
myAnimals.add(new Dog());

try( BufferedWriter output = new BufferedWriter(new OutputStreamWriter(System.out))){
   for(Animal animal : animals)
      animal.giveSound(output); 
}

答案 2 :(得分:0)

没有任何<div class="teamColumn">&nbsp;</div> <div class="teamColumn">&nbsp;</div> <div class="teamColumn">&nbsp;</div> <div class="teamColumn">&nbsp;</div> <div class="teamColumn">&nbsp;</div> <div class="teamColumn">&nbsp;</div> <div class="teamColumn">&nbsp;</div> <div class="teamColumn">&nbsp;</div> <div class="teamColumn">&nbsp;</div> <div class="teamColumn">&nbsp;</div> <div class="teamColumn">&nbsp;</div> <div class="teamColumn">&nbsp;</div> <div class="teamColumn">&nbsp;</div> <div class="teamColumn">&nbsp;</div> <div class="teamColumn">&nbsp;</div> <div class="teamColumn">&nbsp;</div>检查,没有其他方法可以执行;除非您的instanceOf有一个定义,该定义说要接受一些通用对象,并且ArrayList::addCat从此扩展。但是,即使DogObject还有其他方法,您仍然只能调用Cat中的方法。您可能会看到为什么在这种情况下泛型如此方便...

答案 3 :(得分:0)

我做了一些工作。要访问数组列表中对象的方法,我们可以使用java.lang.reflect包。

我首先可以获取所有已声明的方法,然后使用参数来调用它们。

所以我的程序将是:

                  public class Methodcall{
                       ArrayList <Object> al =  new ArrayList<Object>();
                        al.add(new Cat());
                        al.add(new Dog());
                        for(Object a:al)
                           {
                               class ax = a.getClass();
                               Method[] methods=ax.getdeclaredMethods();
                               for(Method m:methods)
                                 {
                                    System.out.println(method.getName);
                                  }
                            }
                 }
                }

在此之后,我们可以使用其他反射成员来访问方法。

谢谢大家。