2017-09-25 3 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のではないでしょうか?名前を経由してそれらを分離

    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); 
    } 
    

    または:

  2. よりもより良い解決策はありますか?

+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 
} 

アプリケーションはまだそれがIntegerDoubleのインスタンスだと、その後オーバーロードされたメソッドdrawImageへのルートを場合、あなたは表示オブジェクトを確認することができintdoubleを区別する必要がある場合。

+0

問題は、display.getX()。intValue()がintValue()部分が何であるかを知らないことです。 –

+0

次に、Numberのすべてのサブクラスのジェネリックで上記のような単一のメソッドを用意し、次にinstanceOfをチェックして、intを処理し、プリミティブでdrawImageをオーバーロードしてdoubleを処理します。この状況のた​​めのファクトリ・メソッド・デザイン・パターンがもう一つの選択肢です。 – JRG

関連する問題