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 回答