假设我有这些课程:
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());
答案 0 :(得分: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的实际泛型类型匹配。
答案 1 :(得分: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`
答案 2 :(得分:0)
您想将1种对象转换为另一种对象。试试adapter pattern。请查看wiki链接以获取更多内部适配器模式。
创建一个Adapter类,将对象B转换为对象A.
class MyAdapter
{
public static A adaptTo(B b)
{
//your code to transform B to A
}
}
现在,当您想要将B转换为A时,只需调用
即可A a = Adapter.adaptTo(b);