0

これらのクラスがあるとしましょう:

class A<T> {
  void set(T t) {}
}

class B<T> {
  T get() { return null; }
}

class C extends A<String> { }
class D extends B<String> { }

class E extends A<Long> { }
class F extends B<Long> { }

そして、これらの変数:

A<?> a1 = new C();
B<?> b1 = new D();

A<?> a2 = new E();
B<?> b2 = new F();

これらをどうにかして行うことはできますか (魔法を使って?):

a1.set(b1.get());
a2.set(b2.get());
4

3 に答える 3

4

いいえ、できます。

A<String> a1 = new C();
B<String> b1 = new D();

A<Long> a2 = new E();
B<Long> b2 = new F();

a1.set(b1.get());
a2.set(b2.get());

A<?>はあるクラスの A を意味しますが、どのクラスかわかりませんset()したがって、コンパイラは引数の型が A の実際のジェネリック型と一致するかどうかわからないため、そのメソッドを呼び出すことはできません。

于 2012-07-10T10:43:01.733 に答える
3

あなたが持っているので、あなたはできません

A<?> a1 = new C();
B<?> b1 = new D();

と同じです

A<? extends Object> a1 = new C();
B<? extends Object> b1 = new D();

したがって、 のジェネリック型aはワイルドカードまたは不明です。b1.get() は でありObject、a1.set() は Object の未知のサブクラスを取ります。

A<String> a1 = new C();
B<String> b1 = new D();
a1.set(b1.get()); // is okay as the type is `String`
于 2012-07-10T10:41:28.973 に答える
0

ある種類のオブジェクトを別のオブジェクトに変換したい。アダプター パターンを試してください。アダプタ パターンの詳細については、wiki リンクを確認してください。

オブジェクト B をオブジェクト A に変換するアダプタ クラスを作成します。

class MyAdapter
{


public static A adaptTo(B b)
{
//your code to transform B to A

}

}

B を A に変換したい場合は、単に呼び出します

A a = Adapter.adaptTo(b);
于 2012-07-10T10:40:50.823 に答える