2012-03-30 10 views
8

次のシグネチャでメソッドを実装する簡単な方法はありますか?最低限、実装ではプリミティブ型(DoubleやIntegerなど)を処理する必要があります。非プリミティブ型は素晴らしいボーナスになります。java generic String to <T>パーサー

//Attempt to instantiate an object of type T from the given input string 
//Return a default value if parsing fails 
static <T> T fromString(String input, T defaultValue) 

実装はFromStringインタフェース(または同等)を実装したオブジェクトの些細なことだろうが、私はそのようなものを発見していません。私は、リフレクションを使用する機能的な実装も見つけていません。

+0

なぜあなただ​​けではなく、 'T'の ' T 'を返すようにしようとしていますか? – Makoto

+0

@Makotoこれは一般的な方法です。 ''はメソッドの型変数を宣言します。戻り値の型は単に 'T'として宣言されます。 – erickson

+0

十分に良い。今、私は理解します、ありがとう。 – Makoto

答えて

5

これは、別の引数としてClass<T>を指定した場合にのみ可能です。 T自体には、目的の戻り値の型に関する情報は含まれていません。

static <T> T fromString(String input, Class<T> type, T defaultValue) 

次に、typeでタイプを識別できます。具体的な例はthis blog articleにあります。

+2

はい、APIが 'defaultValue'が非ヌルであることを要求しない限り、型が必要です。 –

+0

@DilumRanatungaあなたは精巧にできますか? null値を渡すと型の推論が不可能になることがわかりますが、Tの具体的な型を決定する問題を解決する方法はわかりません。 – cqcallaw

+1

'defaultValue.getClass()'を使用して型を 'クラス 'です。 – BalusC

1

特定の型で特定の型を解析するオブジェクトが必要です。明らかに、型からちょうど任意の型を解析する方法を決定することはできません。また、解析の仕方を何らかの形で制御したいと思うかもしれません。数字のカンマは大丈夫ですか?空白を削除する必要がありますか?

interface Parser<T> { 
    T fromString(String str, T dftl); 
} 

シングル抽象メソッドの種類がうまくいけば、Java SEの中で8

+0

幸いにも、私の目的のために、構文解析メカニズムを細かく制御する必要はありません。解析に失敗した場合は、デフォルト値に戻すだけで十分です。 – cqcallaw

0

を実装するために少ない冗長おそらく、ソリューションを実装する方法の質問に答えていないしなければならないが、ちょうどこの(すなわちありませライブラリがあります要求とほぼ同じAPI)。それはtype-parserと呼ばれていますし、このようなものを使用することができます

TypeParser parser = TypeParser.newBuilder().build(); 

Integer i = parser.parse("1", Integer.class); 
int i2 = parser.parse("42", int.class); 
File f = parser.parse("/some/path", File.class); 

Set<Integer> setOfInts = parser.parse("1,2,3,4", new GenericType<Set<Integer>>() {}); 
List<Boolean> listOfBooleans = parser.parse("true, false", new GenericType<List<Boolean>>() {}); 
float[] arrayOfFloat = parser.parse("1.3, .4, 3.56", float[].class); 
関連する問題