Java Generics示例 - 我不明白这个?

时间:2011-08-15 19:35:42

标签: java generics

假设我有一个名为Car的类,并且在另一个类中(名称无关紧要)我想创建一个通用向量,它可以容纳类型Car。但是,我显然希望此向量使用泛型,因此类似Vector<E> myVector等。假设类Car有一个方法getCarMake()

如果我有以下内容:

    public class myClass<E> {

        Vector<E> myVector = new Vector<E>();

        for(i=0; i<myVector.size(); i++){
           Car tempCar = myVector.get(i);
       sysout(tempCar.getCarMake());
    }

当我将Car tempCar更改为E tempCar时,如果不在tempCar.getCarMake()执行类型Car的转换,我就不会调用tempCar?当然还有这个,或者它不是非常通用的?

我想要:

for(i=0; i<myVector.size(); i++){
   E tempCar = myVector.get(i);
   sysout(tempCar.getCarMake());
}

5 个答案:

答案 0 :(得分:4)

您可以简单地创建Vector这样的

Vector<Car> myVector = new Vector<Car>();

顺便说一下,如果你使用最近的Java(小于8年) (愚蠢的我,这是一个泛型问题,当然你是)最好使用ArrayList(如果你需要线程安全,请将它包装在Collections.synchronizedList中,但我不认为你这样做。)

更新:我看到你编辑了这个问题。这里的答案只是将您的类声明更改为

public class myClass<E extends Car> {

答案 1 :(得分:1)

泛型的关键是,你可以编写一个可以控制放入其中的对象类型的类。使用Vector泛型允许您控制成员,您可以将其放入其中。它还使您的代码更好,因为您可以像第一个示例一样编写代码。

你的第二个例子毫无意义。如果您已定义,Vector只能保留Car,您为什么不这样说?

答案 2 :(得分:1)

这个怎么样?

汽车集装箱是你真正想要的。

public class VehicleContainer<T extends Vehicle> {

    private Vector <T> vehicleList = new Vector<T>();

    public void enlistVehicles() {
        for (int i=0;i<vehicleList.size();i++) {
            T vehicle = vehicleList.get(i);
            System.out.println(vehicle.getMake());
        }
    }

车辆就是界面。

public interface Vehicle {

    public String getMake();
}

和Car是具体的实施。

public class Car implements Vehicle {
    public String getMake() {
        return "Audi";
    }
}

答案 3 :(得分:0)

如果没有在类或方法的上下文中声明它,则泛型类型E没有意义。假设你有一个像这样定义的方法 -

public void <E extends Car> aMethod() {

然后你可以在那个方法中做到这一点。

Vector<E> carVector = new Vector<E>();
for(i=0; i<myVector.size(); i++){
   E tempCar = myVector.get(i);
   sysout(tempCar.getCarMake());
}

答案 4 :(得分:0)

你过分思考自己的情景。您定义了要执行的操作 - 创建仅接受Car对象的集合。泛型是允许您执行此操作的Java功能。 Aka,拥有一个只接受汽车并且拥有使用泛型的集合的集合并不相互排斥,事实上它们是相互依赖的!

如果没有Generics,您可以像这样创建一个Vector:

Vector vehicleVector = new Vector();

但是,当然,所创作的收藏品会随意接受各种物品 - 兔子,汽车,自行车,香蕉......

但是从Java 5开始,我们得到了Generics,它有点误导性命名,但它允许你做的是在编译时强制执行一组对其他对象的对象类型约束。所以你的代码变成了:

Vector<Car> vehicleVector = new Vector<Car>();

现在您不必担心所有其他讨厌的对象类型潜入您的Car系列!另外,你可以编写更少的代码!使这成为可能的魔力是泛型。换句话说,你已经完成了你想做的事情:)