2013-01-07 15 views
5

を制限することができますか?私。 TはStringまたはintまたはdoubleなどです。これは可能ですか?どのように私は、私は次のコードは、しているJavaのジェネリック

P.S.

私は唯一の文字列を持っている必要はありませんので

protected <T extends String> T getValueForKey(String key) { 

} 

を使用したくない

..

+2

注: '文字列が最終であるため' == を。 – assylias

+1

protected getValueForKey(String key、Class resultClass)getValueを呼び出すときに戻り値の型を設定します... – anfy2002us

+1

入力値を制限していた場合、いくつかの異なるオーバーロードを使用できますが、出力を再制限する。 –

答えて

6

私は別のアクセサメソッドを持つことを示唆している戻り値をオーバーロードすることはできませんので:

protected int  getIntForKey(String key); 
protected double getDoubleForKey(String key); 
protected String getStringForKey(String key); 
2

私は、唯一のStringにジェネリック型を制限する方法があると思ういけませんIntegerとDoubleを使用できますが、<T extends Comparable>としてString、Integer、DoubleのすべてがComparableを実装しています。 しかし、多くの他のクラスのもjava.util.DateのようにComparableを実装して、私はあなたが返す「文字列または整数またはダブル」などができとにかく知らない

+0

これはまた、他の多くの種類(たとえばDate)を許可します。私はこれが頼まれているとは思わない。 – assylias

+0

@assylias trueですが、ジェネリックスを使用しているのではなく、他のアプローチがあると思いますか? – PermGenError

+0

いいえ私はそこには、より適切な答えだろうとは思わない;-) – assylias

1
protected <T extends Object> T getValueForKey(String key); 

あなたができました返されるオブジェクトのクラス名をチェックするロジックを追加し、返されたオブジェクトが目的のタイプでない場合は例外をスローします。

+0

あなたが型の安全性を失うこのアプローチの危険性はありませんか? –

+0

T extends Objectを使用するように更新しました – cowls

0

これを実行する直接的な方法はありません。
タイプTに使用されるクラスは、制限されるために何か共通のものを持たなければならない。I.E. Tすべては、いくつかのインターフェイスを実装する必要がされているクラス - クラスclassNameがprotected T getValueForKey(String key)を含むクラスであれば、これはInterfaceName

であると仮定し、あなたがして、次のようにクラスClassNameを宣言する必要があります。

class ClassName<T extends InterfaceName> 

A非常に同様の問題は、すでにこのURLで頼まれた:@のanfy2002usのコメントをエコー

How to restrict types which are allowed as "T" in a generic class?

+0

あなたはより具体的になることができますか? –

+0

T型はすべて共通のインタフェースを実装しなければならないという制約があります - それらはすべて実装されているインタフェースですか? (カンマで区切られたリストを使ってTが複数のインタフェースを実装することを要求することさえできます) –

0

- それはCAのOKなら指定されたキーに関連付けられた値の望ましい型を知ることができます。これはどうですか?

protected <T> T getValueForKey(String key, Class<T> type) { 
    return currentStats.containsKey(key) ? type.cast(currentStats.get(key)) : null; 
} 
関連する問題