为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

隔江千里 2021-09-12 20:15:48
我在 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();
查看完整描述

3 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

这里要学习的教训是*多态性”。


类,Cat并且Dog应该实现一个公共接口,声明可用于它们的方法:


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

   }

}

然后你给你的collecton一个最通用的通用类型的泛型参数,提供你想要访问的方法:


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

}


查看完整回答
反对 回复 2021-09-12
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

我做了一些工作。要访问数组列表中对象的方法,我们可以使用 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);

                                  }

                            }

                 }

                }

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


查看完整回答
反对 回复 2021-09-12
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

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

你可以这样做。

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


查看完整回答
反对 回复 2021-09-12
  • 3 回答
  • 0 关注
  • 277 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信