2016-07-08 11 views
2

から非ジェネリックメソッドを呼び出すには:はどのように一般的なものから非ジェネリックメソッドを呼び出すためにどのように一般的なもの

class Test { 
     ... 
     public <T> int someFunction1(T someParam) { 
      return someFunction2(someParam); 
     } 

     public int someFunction2(String someParam) { 
      return 1; 
     } 

     public int someFunction2(Integer someParam) { 
     return 1; 
     } 
    } 

Test t = new Test; 
t.someFunction1(new String("1")); 
t.someFunction1(new Integer(5)); 

また、それはむしろ、実行時に比べて、コンパイル時にこれを実行することは可能でしょうか?

+0

であれば、この答えはのみ動作します:http://stackoverflow.com/help/how-to-質問 –

+0

私の答えで言われたように、何とかそれを行うことができますが、それは "悪いデザイン"のように聞こえる。だからあなたに戻って質問してください。あなたはこのようにどのような問題を解決しようとしていますか? – GhostCat

+0

[GhostCa](http://stackoverflow.com/users/1531124/ghostcat) このタイプのプラクティスはC++で悪いとは考えていませんか?私はちょうどJavaで同じことをすることが可能であることを知りたがっていました。 –

答えて

4

someParamStringまたはIntegerのいずれかであるとコンパイラが判断できません。このような何かが動作します:

public <T extends String> int someFunction1(T someParam) { 
    return someFunction2(someParam); 
} 

public int someFunction2(String someParam) { 
    return 1; 
} 

をあなたはそれがString/Integerになりたいと思った場合は、いくつかのデータ型またはTInteger

それとも、いくつかの「醜いにバインドされているsomeFunction1の作成、オーバーロード定義を作成する必要があります「キャスト:

public <T> int someFunction1(T someParam) { 
    if (someParam instanceof Integer) 
     return someFunction2((Integer) someParam); 
    else if (someParam instanceof String) 
     return someFunction2((String) someParam); 
    else throw new IllegalArgumentException("Expected String or Integer") 
} 
3

あなたは引数の型をチェックし、その種類に応じて、明示的に正しい方法をキャストして呼び出す必要があります。

public <T> int someFunction1(T someParam) { 
    if (someParam instanceof Integer) 
     return someFunction2((Integer)someParam); 
    else if (someParam instanceof String) 
     return someFunction2((String)someParam); 
    else 
     throw new InvalidArgumentException("Unexepected type: "+someParam.getClass()); 
} 
+0

コンパイル時に同じことをすることはできますか? –

+0

@VardanHovhannisyan:あなたはそのタイプを解決することを意味しますか?メソッドがどのコンテキストから呼び出されるかを知ることができないので、これは不可能です。上記は唯一の方法です。 –

+0

@VardanHovhannisyanどのように 'someFunction1'を呼びますか? 'Integer'、' String'などへの参照を持っていますか、 'Object'だけ持っていますか?前者の場合は、 'someFunction2'のすべてのオーバーロードを' someFunction1'にリネームするだけです。 'someFunction1(String)'オーバーロードは 'someFunction1(T)'で選択されます。なぜなら、それは消去後により具体的であるからです。もしそうでなければ、あなたは 'instanceof'チェックに悩まされています。 –

0

ジェネリックスは何も追加しません。次のことができます(とすべきである)の挙動を変更することなく、メソッドから型の変数を削除します。

public int someFunction1(Object someParam) { 

、その後、他の回答で提案されているif/elseinstanceofチェーンのいずれかを適用します。

0

パラメータが動作していないかについてより多くの情報を提供してください常に文字列または整数

public <T> int someFunction1(T someParam) { 
    try { 
     return someFunction2((String) someParam); 
    } catch (ClassCastException e) { 
     try { 
      return someFunction2((int) someParam); 
     } catch (ClassCastException ex) { 
      return 0; 
     } 
    } 
} 
+0

そして記録のために、それは問題を "解決"するための本当に悪い方法です。他の言語とは対照的に、あなたはjavaではこのような例外を**使用しません**。 – GhostCat

関連する問題