2011-09-05 109 views
2

我正在一个项目,我试图使用泛型,但我很难。假设我有很多汽车,它们都在不同的类中实现(例如audi.java,toyota.java等),并且每个汽车都有一个名为startCar()的方法。现在我想创建一个类汽车,让其他班级使用这些汽车。但是,以下内容不起作用。我应该如何去实施它?Java的泛型问题

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

我也尝试过创建一个接口,但也给了错误。

感谢

编辑,试图nfechner的建议

感谢所有的答复!

将在以下工作(注:。GenericCar是所有汽车中实现(例如audi.java的接口),并具有以下功能:startCar()

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

您需要先解决您的语法错误。我希望汽车是汽车的集合。有什么理由需要这个类,为什么其他类不能使用MyCar? –

+1

此文章由德国和日本汽车制造商XD赞助。 –

回答

5

不幸的是,泛型不能用于实例化一个类,而不是用Java来实现。也许你可能对你的意图有点更具体,但你可能会觉得它有用有一些基类汽车,并有每个具体的约再扩展它。如果您在基类Car中定义startCar()方法,则Car的每个子类型都将通过多态性具有此方法。

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

public class Audi extends Car{} 

public class Toyota extends Car{} 

等等。

+0

+1,但我看不到这里的不幸。泛型与类型安全有关。好的OO设计是另一回事。 –

+0

Java泛型以静态分析的形式实现;在说新的E()时没有更多的伤害;比说新的ClassName();因为两者都将在编译时被知道和检查。 –

+0

我可以在这种情况下做以下事情:'汽车mycar =新奥迪;'? – foges

3

您的代码看起来有点过度设计了什么问题有一个简单的Car接口,所有类型的汽车都可以实现吗?

1

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

2

你不应该在这里使用泛型。 (把它们想象成你不想修复的类型参数,例如Collection)。

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

但更好的设计是使用组合而不是继承,即汽车有一个品牌类的领域。如果行为没有受到强烈影响,情况尤其如此。我不认为奥迪的表现与丰田差别很大。

此外,我不认为有那么多品牌,并且您可能只需要每个品牌的一个实例。因此,使用枚举而不是品牌的类。详细信息:

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 
} 

您可以将方法放在品牌枚举中,用于小型且具体的变化行为。我认为Java Enums的作者Josh Bloch在Effective Java, 2nd edition中很好地解释了他们的能力。

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