[英]Java generics problem
我正在開發一個項目,我正在嘗試使用泛型,但我很難過。
假設我有很多汽車,所有汽車都在不同的類中實現(例如,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();
}
}
遺憾的是,泛型不能用於實例化類,而不能用Java實例化。 也許你可能會對你的意圖更具體一些,但你可能會發現有一些基類Car並讓每輛特定的汽車擴展它是有用的。 如果在基類Car中定義startCar()方法,Car的每個子類型也將通過多態來使用此方法。
public class Car{
public void startCar(){ }
}
public class Audi extends Car{}
public class Toyota extends Car{}
等等。
你的代碼看起來有點過分了。 所有汽車類型都實現了簡單的Car
界面有什么問題?
在這個例子中, 繼承和多態將是一個比泛型更好的解決方案。
檢查此示例。 Java教程 - 繼承和多態
你不應該在這里使用泛型。 (將它們視為您不想修復的類型參數,例如Collection)。
如果不同品牌的汽車表現不一樣,那就做繼承了,就像Jonathan所說的那樣。
但更好的設計是使用構圖而不是繼承,即汽車擁有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第2版中很好地解釋了他們的能力。
最后,嘗試為您的類和變量選擇更好的名稱(我不認為MyCar會告訴您任何事情)。
這不是使用泛型是合適的情況。 您應該使用接口或超類。 我不確定你在界面上看到了什么錯誤,但修復它們比嘗試用這種方法解決問題更容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.