2009-06-24 2 views
2

私は、オブジェクトのArrayListを他のオブジェクトのArrayListに変換するクラスを作成しようとしています。すなわちArrayList内のオブジェクトのタイプを検出します

ArrayList<Foo> convert(ArrayList<Bar> input){ 
    //conversion logic 
} 

ArrayList<Bar> convert(ArrayList<Foo> input){ 
    //conversion logic 
} 

残念ながらJavaは、同じ名前とそれが同じ入力と出力であることを信じているとの二つの機能を持っている必要はありません。

私は別のルートを試みています。代わりに、同じ名前の複数の機能のうち、私は、ArrayListのを受け入れる一つの機能を作りたい、内部で適切な変換を行い、そしてArrayListのを返すオブジェクトの種類を決定します。

ArrayList convert(ArrayList input){ 
    //conversion logic for Foo 

    //conversion logic for Bar 
} 

は、この可能性のようなものです?

+0

は、あなたの目的のためにバーとFooの間の任意のサブタイプ関係がありますか? – notnoop

+0

問題点:柔軟性のために、入力はListやもっと良いCollectionなどのインターフェースでなければなりません。実際には戻り値の型もインタフェースでなければなりません。 –

+0

あなたの目標を明確にしてください。いくつかの種類の間で汎用コンバータまたは変換を作成したいですか?後者の場合は、メソッド名にソース・タイプまたはターゲット・タイプ名を入れるだけです。 – akarnokd

答えて

4

どうインタフェースについて:その後、

public class Converter<From, To> { 
    List<To> convert(List<From> input); 
} 

そして、あなたが望む限り多くの実装を持っています。たとえば、次のように

private static final Converter<Foo, Bar> fooToBarConverter = new Converter<Foo, Bar>() { 
    public List<Bar> convert(List<Foo> input) { 
     ... 
    } 
} 
4

は試してみてください。

public <T, U> ArrayList<U> convert(Class<T> typeIn, ArrayList<T> input){  
    // dispatch on typeIn 
} 

いっそ

public <T, U, V extends ArrayList<U>> V convert(Class<T> typeIn, 
Class<V> typeOut, ArrayList<T> input){  
    // dispatch on typeIn 
    return typeOut.cast(yourConversionResult); 
} 

あなたは同じメソッド内ArrayList<Foo>またはArrayList<Bar>を返す可能性があり、適切なキャストを持つことは、あなたがそれらを返すのに役立ちますのでコンパイラ警告なし。

編集: 2番目のサンプルの戻り値の型キャストは機能しませんでした。修正しようとしました

+0

これは私の答えよりも良いかもしれないと思っています。 (ところで、そこに "public"を追加して、XMLモードの構文を強調表示させることができます)。 –

+0

私はの構文に慣れていません。もっと冗長な例やリンクを提供してもらえますか? – KevMo

+0

@KevMo:これは、そのクラスが含まれていなくても、メソッドが汎用であることを意味します。 –

0

基本的には、関数型プログラミングの観点から「マップ」を記述しています。オブジェクトのリストを取得し、各オブジェクトに操作を適用し、結果を別のリストに蓄積します。私は最近見たことはありませんが、すでにこのようなものを実装しているライブラリがあります。コモンズコレクションには、ジェネリックコレクション前のコレクションがあることが分かります。

ソリューションの要旨は、(mmeyersソリューションに似ている)である:

public interface Function<From,To> { 
    public To apply(From); 
} 

public <From,To> List<To> map(List<From> fromList, Function<From,To> fun) { 
    // call fun.apply() on every element in fromList and return a new result list ... 
} 
+0

あなたは#18の私の名前をスペルミスしています。おめでとう。;) –

+0

ねえ、私の悪い。 :) – james

関連する問題