如果您不知道 class 该对象来自 Java,您如何从向量中的对象引用方法?

How do you reference a method from an object in a vector, if you don't know what class the object is from in Java?

我的程序中有一系列对象,我想将它们保存在 Vector 中,如下所示:

public class Submarine{ //class that describes submarines

//...some code

int x, y;   

    public Submarine(){

        x = 10; 
    y = 93;

}

    public int getX(){
    return x;
    }

    public int getY(){
    return y;
    }

    //...some code

}



public class Dog extends animal{ //class that describes dogs

//...some code

    public Dog(){

        x = 12; 
        y = 54;

    }

    public String getBark(){

    return"Bark!"
    }

    public int getX(){
    return x;
    }

    public int getY(){
    return y;
    }

    //...some code

}


public class Cat extends animal{ //class that describes cats

//...some code

    public Cat(){

    x = 25; 
    y = 532;

    }

    public String getMeow(){

    return"Meow!"
    }

    public int getX(){
    return x;
    }

    public int getY(){
    return y;
    }

    //...some code

}


public class animal { // the superclass of the animals Dogs and Cats

//some code

    int x, y; // the x and y coordinates of the animal

//some code

}

在我的主 class 中,我还有一个 Vector,我想将这些对象保存在:

import java.util.Vector;


public class MainClass { //the main class that runs the program

    public static void main(String[] args){

        Cat c = new Cat();
        Submarine s = new Submarine();
        Dog d = new Dog();

        Vector<Object> v = new Vector<Object>(); //Vector that holds random objects

        v.add(c);
        v.add(s);
        v.add(d);

}

}

现在我希望能够引用每个对象的方法,所以我尝试将以下代码放入我的 MainClass 的末尾:

System.out.println(v.get(1).getMeow()); //should print "Meow!"
System.out.println(v.get(2).getBark()); //Should print "Bark!"
System.out.ptintln(v.get(3).getX()); //should print 10 from the submarine object

甚至:

for(int i = 0; i <= 2; i++){
System.out.println("X coordinate: " +v.get(i).getX + ", Y coordinate: " + v.get(i).getY);
}

但它却让我感到不安,并大喊异常。我如何将对象放入 Vector(以任何方式不相关的对象)并在不知道我正在引用的对象的 class 的情况下引用每个 class 内部的方法? - 这是我的主要问题!

我希望: v.get(index).whateverMethodIWant(); 会工作,但它想知道 class 我从哪里调用方法,我该如何解决这个问题?

您已将 v 声明为对象向量。对象 class 没有 getX 或 getY 方法,这就是编译器给您错误的原因。

如果您想对 v 的元素使用 getX 和 getY 方法,则需要将其声明为具有这些方法的存储对象。这样做的方法是使用接口:

public interface Coordinated {
    int getX();
    int getY();
}

public class Submarine implements Coordinated {
    ....
}

List<Coordinated> v = new Vector<>();
v.add(new Submarine(...));
v.get(1).getX();

按照编码的方式做自己想做的事,反思肯定是最好的(但不是最明智的)选择。您提供的示例使用了对象的方法名称,这表明您已经知道它们是什么类型,正如 OP 的评论中所指出的那样。

对象多态性背后的思想是您可以在编译时不知道对象的类型的情况下定义和调用对象的不同行为。

更常见并且可能 "proper" 做你想做的事情的方法是定义一个接口或一个抽象基础 class 来描述你试图存储在向量中的对象族.

此接口将定义并公开一组通用的 methods/operations,您可以在任何实现该接口的对象上调用它们,具体实现由实现 class.

决定

例如,假设您定义了一个接口 Enemy 并且它定义了一个方法 getAction()

public interface Enemy {
    public void getAction();
}

您可以让您的 "enemy" classes,(我们将使用您的 Dog、Cat 和 Submarine 示例)实现此接口,并将特定功能包装在 getAction方法。

public Cat extends Animal implements Enemy {
    //....
    public void getAction() {
        getMeow();  // call cat's specific action
    }
}

public Dog extends Animal implements Enemy {
    //....
    public void getAction() {
        getBark();  // call dogs's specific action
    }
}

public Submarine implements Enemy {
    // ....
    public void getAction() {
        // for sake of argument, let's just getX();
        getX();
    }
}

然后,您可以创建一个 VectorEnemy 类型,并简单地调用 getAction() 它们,而实际上不知道类型。

public static void main(String[] args){

    Cat c = new Cat();
    Submarine s = new Submarine();
    Dog d = new Dog();

    List<Enemy> v = new Vector<>(); //Vector that holds random Enemy objects

    v.add(c);
    v.add(s);
    v.add(d);

    System.out.println(v.get(0).getAction()); //should print "Meow!"
    System.out.println(v.get(1).getAction()); //should print 10 from the submarine object
    System.out.ptintln(v.get(2).getAction()); //should print "Bark!"
}