Java泛型问题

时间:2011-09-05 07:50:13

标签: java generics

我正在开展一个项目,我正在尝试使用泛型,但我很难过。

假设我有很多车,所有车都在不同的类中实现(例如,audi.java,toyota.java等),并且每个车都有一个名为startCar()的方法。现在我想创建一个类汽车,让其他类使用这些汽车。但是以下方法不起作用。我该如何实施呢?

public class Cars {    
 private MyCar mycar;
 private class MyCar <MySpecificBrandOfCar>{
    private MySpeicifBrand mySpecifcCar;
    public MyCar(){}
 }
 public Cars(){
     myCar = new myCar<audi>;
 }
 ..other methods..
}

我也尝试过创建一个界面,但这也给出了错误。

由于

编辑,尝试了nfechner的建议

感谢所有回复!

以下工作(NB:GenericCar是一个由所有汽车实施的接口(例如audi.java)并具有诸如startCar()等功能

public class Car{
    private GenericCar mycar;
    public Car(){
        mycar = new audi();
    }
}

5 个答案:

答案 0 :(得分:5)

遗憾的是,泛型不能用于实例化一个类,而不是Java。也许你可能会对你的意图更具体一些,但你可能会发现有一些基类Car并让每辆特定的汽车扩展它是有用的。如果在基类Car中定义startCar()方法,Car的每个子类型也将通过多态来使用此方法。

public class Car{
    public void startCar(){ }
}

public class Audi extends Car{}

public class Toyota extends Car{}

等等。

答案 1 :(得分:3)

您的代码看起来有点过分。一个简单的Car接口出了什么问题,所有车型都实现了?

答案 2 :(得分:3)

在此示例中,继承多态将是比泛型更好的解决方案。

检查此示例。 Java Tutorial - Inheritance and Polymorphism

答案 3 :(得分:2)

你不应该在这里使用泛型。 (将它们视为您不想修复的类型参数,例如Collection)。

如果不同品牌的汽车行为不一样,那就做继承了,就像乔纳森所说的那样。

但更好的设计是使用构图而不是继承,即汽车拥有Brand类的领域。如果行为没有受到强烈影响,情况尤其如此。而且我认为奥迪的表现与丰田不同。

此外,我不认为有那么多品牌,你可能只需要每个品牌的一个实例。所以使用枚举而不是Brand的类。详细说明:

public class Car { 
 public static enum Brand { Audi, Toyota };    
 private Brand brand;

 public Cars(Brand brandParam){
     this.brand = brandParam;
 }
 //..other methods, getter and setter for brand
}

您可以将方法放在Brand枚举中,以获得小的和特定的变化行为。我认为Java Enums的作者Josh Bloch在Effective Java, 2nd edition中很好地解释了他们的能力。

最后,尝试为你的类和变量选择更好的名字(我不认为MyCar告诉你任何事情)。

答案 4 :(得分:1)

这不是使用泛型适当的情况。您应该使用接口或超类。我不确定你在界面上看到了什么错误,但修复它们比尝试用这种方法解决问题更容易。