Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以调用对象方法而不继承它们的类吗_Java_Collections - Fatal编程技术网

Java 我可以调用对象方法而不继承它们的类吗

Java 我可以调用对象方法而不继承它们的类吗,java,collections,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);

我在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();
用于(动物a:al)
X类=对象获取类(a);
((X)a.somemethod();

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

你可以这样做

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

没有任何
实例进行检查
没有其他方法;除非您的
ArrayList::add
有一个定义,该定义表示接受某个通用对象,并且
Cat
Dog
从中扩展。但您仍然能够调用的唯一方法是来自该
对象的方法,即使
Cat
Dog
还有其他方法。您可能会明白为什么泛型在这些情况下如此方便

这里要学习的是“多态性”

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); 
}
Collection myanives=new ArrayList();
添加(新的Cat());
添加(新狗());
try(BufferedWriter输出=新的BufferedWriter(新的OutputStreamWriter(System.out))){
用于(动物:动物)
动物。声音(输出);
}

我做了一些工作。要访问数组列表中对象的方法,可以使用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);
                                  }
                            }
                 }
                }
公共类方法调用{
ArrayList al=新的ArrayList();
添加(新的Cat());
添加(新狗());
用于(对象a:al)
{
类ax=a.getClass();
方法[]methods=ax.getdeclaredMethods();
用于(方法m:方法)
{
System.out.println(method.getName);
}
}
}
}
在此之后,我们可以使用反射的其他成员访问方法


谢谢大家。

您是否可以展示一下您是如何尝试进行这些方法调用的?您的意思是当您调用
al.get
-您不知道将获得哪种类型的对象?您可以使用instanceof来检查您尝试访问的对象的类型并相应地执行操作。您可以通过执行obj.getClass()来检查对象是哪个类/instanceof then conversion((Dog)al.someDogsAction())。你的问题完全不清楚。到底是谁投票支持这样的输入?…除此之外:不要使用库已经使用过的名称。调用自己的类
ArrayList
只会让读者感到困惑。不要这样做!object.getClass()呢?@vmrvictor仍然是一个
检查
;但是想想看-你公开了这样一个
数组列表
,所以获取类或检查
实例的类型是什么?所有类型?或者只是假设只会放置一些?这取决于要解决的问题,问题是是否有在没有继承/泛型的情况下,instanceof检查继承如何在这种情况下使用instanceof方法。@PradheerKk这完全取决于实现中的
get
返回什么…
Zoo
是一个集合类,“它不继承任何其他类”