2017-06-22 12 views
0

では、次のしていると仮定します。のJava - ジェネリッククラスのコレクション、異なるジェネリック型を持つ各

@AllArgsConstructor 
public class Foo<A> { 
    A a; 
} 

し、次のしている:

Foo<String> fooString = new Foo<>("abc"); 
Foo<Integer> fooInteger = new Foo<>(10); 

List<Foo> foos = new ArrayList<>(); 
foos.add(fooString); 
foos.add(fooInteger); 

そして、私はリストをループにしたいですof foos

for (Foo foo : foos) { 
    ... 
} 

まず、これを達成する別の方法はありますか?

次に、リスト内の各fooオブジェクトの汎用タイプをどのように参照しますか?私はワイルドカードで試してみましたが、コンパイルエラー "キャプチャ#1-of-?..."が発生しました。

+0

"次に、リスト内の各fooオブジェクトの汎用タイプをどのように参照するのですか?" - なぜこれをしたいのですか?あなたの目標は何ですか?これを実現する別の方法については、あなたのFooクラスは実際にはあまり効果がないので、リストを使用しない理由はわかりません。 –

+0

'Foo'を単独で使うと、* raw *ジェネリックを使用しています。それをしないでください。リストに 'Foo 'と 'Foo 'の両方が含まれるようにするには 'List >'と宣言してください。ループは 'for(Foo foo:foos)'でなければなりません。混合リストを作成するときには誰もが持っている通常の問題があります: 'instanceof'を呼び出すと、それぞれの値の型が分かりません。したがって、ループ内に 'if(foo.getA()instanceof String){...} 'のようなコードが必要です。これは一般的には悪い考えです。 – Andreas

答えて

0

fooの型はIntegerまたはStringのいずれかであることがわかっています。これらはFoo.aは決してないことを仮定して、最終的なクラスである `` `NULL``:allFoosを任意のフー・タイプが移入することができれば

Foo<String> stringFoo = ...; 
Foo<Integer> integerFoo = ...; 

List<Foo<?>> allFoos = new ArrayList<>(); 
allFoos.add(stringFoo); 
allFoos.add(integerFoo); 

for (Foo<?> foo : allFoos) { 
    if (foo.a instanceof Integer) { 
     @SuppressWarnings("unchecked"); 
     Foo<Integer> intFoo = (Foo<Integer>) foo; 
     //... 
    } else if (foo.a instanceof String) { 
     @SuppressWarnings("unchecked") 
     Foo<String> strFoo = (Foo<String>) str; 
     //... 
    } else { 
     throw new IllegalStateException("this cannot happen"); 
    } 
} 

は、しかし、一般的に、これは(コンパイル時に知っていない)動作しません。..一度同じバッグ/リストにそれらを混ぜると、インスタンス化コードで使用されていた型を把握する能力が失われます。あなたはこれがnull Foo.aメンバーインスタンスと同じであるが、それは必ずしもそうではないと仮定できます

// assuming constructor defined as Foo(A a) { this.a = a }; 
Foo<Number> one = new Foo<>((double) 100); 
Foo<Double> two = new Foo<>(100); 

Foo<?> oneUnknown = one; 
Foo<?> twoUnknown = two; 

あなたはおそらく、構築されたときの両方がFoo<Number>Foo<Double>しかしoneだったしていることを言ってしまうでしょう。この場合、Fooは非常にシンプルなクラスなので違いはないかもしれませんが、もっと複雑な操作をしていればおそらくそうです。

関連する問題