2016-09-07 9 views
1

私は、2種類のリスト<>オブジェクトを受け入れることができるメソッドがあることを発見しました。例:ジェネリックを使用して複数の引数を持つ共通のメソッドを共有する

public void foo(Long id) {}; 

上記の関数は、それぞれがLong型またはInteger型のいずれかのIDを持つ複数のオブジェクトで呼び出されます。何が起こっていることは、そのIDはロングのように定義しているオブジェクトに対して、このメソッドの呼び出しはうまく動作することです:

class Bar {Long id} 
Bar test = new Bar(1L); 
foo(bar.id); 

しかし、整数のIDを持つオブジェクトのために、私は最初のfooを使用する前に、長整数に変換する必要があります。私はもちろんIntegerを取る新しいメソッドを持つことができますが、Idではそうしません。ジェネリックスでこれを行う方法はありますか?

+1

があなたのメソッドは 'Double'、' Float'のような他の数値型を処理するように変更することでした、等? – Bohemian

+1

'long'と' int'ではなく 'Long'と' Integer'を使う理由はありますか? * id *のユースケースは通常 'null'を排除するので、あなたが記述した問題に遭遇する欲求の他に、私は何も見ません。 'long'と' int'では、明示的な変換は必要ありません... – Holger

答えて

1

いいえ2つのタイプの「OR」タイプは定義できません。

しかし、あなたは両方のLongIntegerタイプを含むNumberを受け入れ、そのlongValue()メソッドを使用することができます。

public void foo(Number number) { 
    Long id = number.longValue(); 
    // rest of code stays the same 
} 
+2

'long'としてパラメータを宣言し、本当に必要なら' Long'にボクシングすることで同じ結果を得ることができます。これには、許可しないというきちんとした副作用があります。 'double'または' BigDecimal'を入力として使用します。 – Holger

関連する問題