簡體   English   中英

Java泛型問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM