假设有以下声明的AGenericClass
:
public class AGenericClass<T> {
T subject;
public void setSubject(T subject) {
this.subject = subject;
}
}
a、b和c变量之间有什么不同?AGenericClass<String> a = new AGenericClass<>();
AGenericClass<?> b = new AGenericClass<String>();
AGenericClass c = new AGenericClass<String>();
a.setSubject("L"); // OK.
b.setSubject("M"); // Error: setSubject(capture<?>) cannot be
// applied to (java.lang.String)
c.setSubject("N"); // Warning: Unchecked call to 'setSubject(T)'
// as a member of raw type 'AGenericClass'
a、b 和 c 在 IDE 中都能够正常声明,但是当调用 setSubject
时它们的行为却不同。