2017-09-25 28 views
0

我有一些方法,我想標記相同,我確定使用重載是可能的解決方案。問題是,我不能做到這一點與集裝箱:Java容器超載

public void render(Vector2Obj<Double> display) { 
    g.drawImage(sprite, display.getX().intValue(), display.getY().intValue(), null); 
} 

public void render(Vector2Obj<Integer> display) { 
    g.drawImage(sprite,display.getX(), display.getY(), null); 
} 

它給我的語法錯誤是「名稱衝突:兩種方法都有相同的擦除」。

我的兩個問題是:

  1. 爲什麼不是Java讓我做到這一點?

  2. 是否有更好的解決比:

    public void renderD(Vector2Obj<Double> display) { //notice the name change 
        g.drawImage(sprite, display.getX().intValue(), display.getY().intValue(), null); 
    } 
    
    public void renderI(Vector2Obj<Integer> display) { //notice the name change 
        g.drawImage(sprite,display.getX(), display.getY(), null); 
    } 
    

    或通過名稱將它們分開?

+0

「或者通過名稱將它們分開?」 2還在做什麼? –

+0

你可以讓'render(int x,int y)'和'render(double x,double x)'重載。 –

+0

沒有什麼只是改變它renderD或renderI而不是隻是渲染 –

回答

0

探索帶有通配符的泛型,例如Vector2Obj<? extends Number>

public void render(Vector2Obj<? extends Number> display) { 
// do something by accessing methods available in Number 
} 

如果你的應用程序仍然需要區分intdouble之間,那麼你可以檢查顯示器的對象,如果它的IntegerDouble一個實例,然後將其路線重載方法drawImage

+0

那麼問題是有display.getX()。intValue()它不知道intValue()部分是什麼。 –

+0

然後像上面一樣使用泛型的Number的所有子類的單一方法,然後檢查instanceOf,然後通過使用基元重載drawImage來處理int和double。對於這種情況,另一個可供選擇的方法是工廠方法設計模式。 – JRG