Java 我可以调用对象方法而不继承它们的类吗
我在Zoo.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);
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
是一个集合类,“它不继承任何其他类”