“更好”使用泛型(?),对象还是分开类?

时间:2017-05-05 13:55:42

标签: java object generics

我有一个包含list<Car>的包装类和一些返回Car对象的方法。

我需要另一个包含list<Bike>的类和具有相同实现的相同方法,但当然还有不同类型的返回类型(Bike)。

我在想,为了避免重复代码并避免使用一个类,我可以使用list<?>list<Object>,但是在返回对象时我需要做一些演员。

您认为哪一个更有效率?

4 个答案:

答案 0 :(得分:2)

根据我的评论,您可以使用以下结构来充分利用泛型。

抽象父类

abstract class Vehicle {
    ...
}

通用的有界列表容器类

class VehicleList<T extends Vehicle> {
    private final List<T> vehicles; // Or any other way you want to hold your data
    ...
}

继承自Vehicle

的具体类
class Car extends Vehicle {
    ...
}

class Bike extends Vehicle {
    ...
}

然后,无论您希望获得Vehicle的列表,都可以使用它,如下所示:

VehicleList<Car> cars = ...;
VehicleList<Bike> bikes = ...;

答案 1 :(得分:1)

您也可以在类上使用泛型。

所以你可以将你的课程设置为

public class MyClass<T> {
private T t;
.....

这样你就可以编写泛型方法

请参阅https://docs.oracle.com/javase/tutorial/java/generics/types.html

答案 2 :(得分:0)

为了提高效率,这并不重要。你不会注意到一个单独的演员,这是一个非常快速的操作,而且泛型已经经常在幕后演员。

然而,对于这种情况

  

我有一个类(它是一个包装器的类),它包含一个list<Car>和一些返回Car对象的方法。

     

现在我应该创建另一个包含list<Bike>的类和具有相同实现的相同方法,但当然还有不同类型的返回类型(Bike)。

更合理的是不使用List<?> List<Object>,而是使自己的类具有通用性,可能是有限的。

答案 3 :(得分:0)

这不是性能问题。我认为这是关于可读性,清晰度和理解的。

如果CarBike等等都扩展了公共基类或接口(例如Vehicle),则效果最佳。

如果您使用带有基本Vehicle界面的泛型,那么您的类看起来像这样:

public class VehicleRepo<T extends Vehicle> { 
    private List<T> vehicles;
    private T vehicle;

    T getVehicle() { return this.vehicle; }
}