我正在开展一个项目,我正在尝试使用泛型,但我很难过。
假设我有很多车,所有车都在不同的类中实现(例如,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();
}
}
答案 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)
在此示例中,继承和多态将是比泛型更好的解决方案。
答案 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)
这不是使用泛型适当的情况。您应该使用接口或超类。我不确定你在界面上看到了什么错误,但修复它们比尝试用这种方法解决问题更容易。