Java 创建实现接口的所有类的向量

Java 创建实现接口的所有类的向量,java,interface,Java,Interface,我有一个接口“Vehicle”和实现该接口的类Car、Bicycle、Bike等 我可以创建接口的向量并为其分配实现类的实例吗? 例如: 向量vi; vi.添加(0,新车()); vi.增加(1,新自行车()); 等等 所以在运行时,我可以简单地检查索引并调用所需的函数?当然可以。这是在运行时使用多态性的一个经典示例 import java.util.Vector; interface Vehicle { public int getNumberOfWheels(); } clas

我有一个接口“Vehicle”和实现该接口的类Car、Bicycle、Bike等

我可以创建接口的向量并为其分配实现类的实例吗? 例如:

向量vi; vi.添加(0,新车()); vi.增加(1,新自行车()); 等等


所以在运行时,我可以简单地检查索引并调用所需的函数?

当然可以。这是在运行时使用多态性的一个经典示例

import java.util.Vector;

interface Vehicle {
    public int getNumberOfWheels();
}

class Car implements Vehicle {

    final int numberOfWheels = 4;

    public int getNumberOfWheels() {
        return numberOfWheels;
    }
}

class Bicycle implements Vehicle {

    final int numberOfWheels = 2;

    public int getNumberOfWheels() {
        return numberOfWheels;
    }
}

public class Program {

    public static void main(String args[]) {
        Vector<Vehicle> vi = new Vector<Vehicle>();
        vi.add(0, new Car());
        vi.add(1, new Bicycle());
        for(Vehicle v: vi) {
            System.out.println(v.getClass().getName() 
                + " has " + v.getNumberOfWheels() + " wheels");
        }
    }
}
import java.util.Vector;
接口车辆{
public int getNumberOfWheels();
}
汽车类工具车{
最终整数车轮数=4;
public int getNumberOfWheels(){
返回轮数;
}
}
自行车类工具车{
最终整数车轮数=2;
public int getNumberOfWheels(){
返回轮数;
}
}
公共课程{
公共静态void main(字符串参数[]){
向量vi=新向量();
vi.添加(0,新车());
vi.增加(1,新自行车());
车辆(v:vi){
System.out.println(v.getClass().getName())
+“具有”+v.getNumberOfWheels()+“wheels”);
}
}
}

当然可以。这是在运行时使用多态性的一个经典示例

import java.util.Vector;

interface Vehicle {
    public int getNumberOfWheels();
}

class Car implements Vehicle {

    final int numberOfWheels = 4;

    public int getNumberOfWheels() {
        return numberOfWheels;
    }
}

class Bicycle implements Vehicle {

    final int numberOfWheels = 2;

    public int getNumberOfWheels() {
        return numberOfWheels;
    }
}

public class Program {

    public static void main(String args[]) {
        Vector<Vehicle> vi = new Vector<Vehicle>();
        vi.add(0, new Car());
        vi.add(1, new Bicycle());
        for(Vehicle v: vi) {
            System.out.println(v.getClass().getName() 
                + " has " + v.getNumberOfWheels() + " wheels");
        }
    }
}
import java.util.Vector;
接口车辆{
public int getNumberOfWheels();
}
汽车类工具车{
最终整数车轮数=4;
public int getNumberOfWheels(){
返回轮数;
}
}
自行车类工具车{
最终整数车轮数=2;
public int getNumberOfWheels(){
返回轮数;
}
}
公共课程{
公共静态void main(字符串参数[]){
向量vi=新向量();
vi.添加(0,新车());
vi.增加(1,新自行车());
车辆(v:vi){
System.out.println(v.getClass().getName())
+“具有”+v.getNumberOfWheels()+“wheels”);
}
}
}

是的,你可以这样做。接口就是这样使用的

现在建议更好的方法:很难做到,因为不太清楚你到底需要做什么。第一个建议是使用ArrayList而不是Vector。两者之间的主要区别在于向量是“同步的”,这意味着线程安全。但是,同步对性能有很大影响,Vector类通过同步对其所有方法的访问来实现全线程安全。通常最好使用非同步容器,如果需要线程安全,最好在容器外部管理您自己的同步,因为您可以根据使用情况将它们放在需要的地方

在极端情况下,如果您的列表具有预先已知的固定大小,您甚至可以使用一个简单数组,即:

Vehicle[] vi = new Vehicle[2];
vi[0] = new Car();
vi[1] = new Bicycle();

是的,你能做到。接口就是这样使用的

现在建议更好的方法:很难做到,因为不太清楚你到底需要做什么。第一个建议是使用ArrayList而不是Vector。两者之间的主要区别在于向量是“同步的”,这意味着线程安全。但是,同步对性能有很大影响,Vector类通过同步对其所有方法的访问来实现全线程安全。通常最好使用非同步容器,如果需要线程安全,最好在容器外部管理您自己的同步,因为您可以根据使用情况将它们放在需要的地方

在极端情况下,如果您的列表具有预先已知的固定大小,您甚至可以使用一个简单数组,即:

Vehicle[] vi = new Vehicle[2];
vi[0] = new Car();
vi[1] = new Bicycle();

请建议其他更好的方法。您尝试过实现您的解决方案吗?我尝试过这样实现:Vector vi=new Vector();vi.添加(0,新自行车());但是,eclipse抛出了以下错误:这一行有多个标记-标记上的语法错误,错误的构造-标记上的语法错误“”,删除此标记-标记上的语法错误,删除这些标记使用
ArrayList
Vector
是一个具有奇怪,添加了几乎无用的同步语义。@user1071840,这是否有效?如果没有,问题是什么?请建议其他更好的方法。您是否尝试过实现您的解决方案?我尝试过这样实现:Vector vi=new Vector();vi.添加(0,新自行车());但是,eclipse抛出了以下错误:这一行有多个标记-标记上的语法错误,错误的构造-标记上的语法错误“”,删除此标记-标记上的语法错误,删除这些标记使用
ArrayList
Vector
是一个具有奇怪,添加了几乎无用的同步语义。@user1071840,这是否有效?如果没有,问题是什么?