2016-07-20 9 views
1

私は、正確な引数の型(別名T)が必要な機能のいくつ持っている:私はこのようにそれらを使用不明なタイプのインスタンスを作成するには?

private <T> void doWork1(T _obj) {...} 
private <T> void doWork2(T _obj) {...} 
private <T> void doWork3(T _obj) {...} 

をし、それが正常に動作します:

public void parse(int id) { 
    switch (id) { 
     case 1: { 
      Integer obj = new Integer(1); 
      doWork1(obj); 
      doWork2(obj); 
      doWork3(obj); 
      break; 
     } 
     case 2: { 
      Double obj = new Double(2); 
      doWork1(obj); 
      doWork2(obj); 
      doWork3(obj); 
      break; 
     } 
     case 3: { 
      CustomClass obj = new CustomClass(); 
      doWork1(obj); 
      doWork2(obj); 
      doWork3(obj); 
      break; 
     } 
    } 
} 

しかし、私はそれが可能かどう思っていましたコードをより簡潔にしてください。つまり、UnknownTypeの代わりに何を入れる必要がありますか?
編集:
1)簡略化した例としてIntegerDoubleを使用しました。実際のコードではカスタムクラスを使用しています。
2)私は事前にObject
おかげ

+0

doWork1がオブジェクトを受け入れる場合は、Objectを使用します。あなたの質問は、doWork1のパラメータがどのように構造化されているか(過負荷か、ただ一つの関数か)によって決まります。 –

+0

@JFMeierこれは、 'T'が無制限であるためです。 –

+0

メソッドの正確な型を知る必要がある場合は、メソッドにパラメータとして 'Class 'を渡す必要があります。 –

答えて

2

NumberまたはObjectを使用できます。どちらも共通のスーパータイプIntegerDoubleです。


しかし、ジェネリックは不要である:

private <T> void doWork1(T _obj) {...} 

は消去後

private void doWork1(Object _obj) {...} 

と同一です。

場合は入力パラメータの型変数を有する点のみである:あなたは、例えば、別の入力パラメータのジェネリックが関連する必要があることを示すために必要

  • あなたはT _objList<T> _listを渡しています。

    T _obj1T _obj2のジェネリックタイプはありませんが、それはTの上限に縮退しています(例:Object);

  • あなたは戻り値の型に関連していると、それが必要な場合:あなたがここにいずれの場合に必要な、これだけ不必要な合併症を削除しないでください

    <T> T doWork1(T _obj) { ... } 
    

+0

編集 –

+0

を参照してください分かりました。うん、 'オブジェクト'は、多くのありがとう –

4

ユーザータイプごobjためNumberを使用することはできませんので、私のdoWork機能で正確な型(クラス)を知っている必要があります。 IntegerDoubleは両方ともこのタイプを拡張しています。

抽象クラス{@code番号は}、{@codeフロート} {ダブル@code}、 プリミティブ型{@codeバイト}に変換された数値を表す クラスプラットフォームのスーパークラスであります{@code int}、{@code long}、{@code short}です。

public void parse(int id) 
{ 
    Number obj = null; 
    switch (id) 
    { 
     case 1: 
     { 
      obj = new Integer(1); 
      break; 
     } 
     case 2: 
     { 
      obj = new Double(2); 
      break; 
     } 
    } 
    doWork1(obj); 
    doWork2(obj); 
    doWork3(obj); 
} 

あなたはこの具体的なことをしたくない場合は、常にObjectを使用することができます。

+0

編集 –

+0

@StephanLeilaを参照してください。あなたの最初の例を使用する場合、 'doWork'の中でどのように型を知っていますか? – kai

+0

良い質問が出ましたが、私は –

関連する問題