Java泛型和通配符

Java泛型和通配符,java,generics,wildcard,Java,Generics,Wildcard,假设我有这些课程: 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> { } 要将一种对象转换

假设我有这些课程:

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> { }

要将一种对象转换为另一种对象。尝试请查看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);

你不能,因为你有

A<?> a1 = new C();
B<?> b1 = new D();
不,但你可以

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());
aa1=新的C();
B b1=新的D();
A a2=新的E();
b2=新的F();
a1.set(b1.get());
a2.set(b2.get());

A
表示某一类的A,但我不知道是哪一类。因此,您不能调用它的
set()
方法,因为编译器不知道参数的类型是否与A的实际泛型类型匹配。

翻译在哪里
b1.get()
返回一个字符串,
a1.set()
接受一个字符串。@PeterLawrey他必须在适配器类方法中实现该逻辑。如果类型相同,他为什么需要这样做?@PeterLawrey他的类型不相同。A类和B类是独立的。他没有提到这两个类的类型在运行时是相同的。“b1.get()返回一个字符串,a1.set()接受一个字符串。”这对我(和JVM)来说已经足够了,我尝试使用z=(a)a1;z、 set(b1.get())似乎有效。这会导致任何问题吗?如果不关心类型安全,为什么要使用泛型?这样做基本上与删除泛型类型,并接受任何类型的对象作为参数是一样的。好吧,这是我的问题,如果我可以在没有类型安全的情况下(安全地)这样做,很抱歉有点不清楚。因此,如果没有类型安全性,我可以按照我想要的方式来做。只是现有的API返回通配符。
A<?> a1 = new C();
B<?> b1 = new D();
A<? extends Object> a1 = new C();
B<? extends Object> b1 = new D();
A<String> a1 = new C();
B<String> b1 = new D();
a1.set(b1.get()); // is okay as the type is `String`
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());