2017-09-25 47 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