Given AGenericClass declared as below:
public class AGenericClass<T> {
T subject;
public void setSubject(T subject) {
this.subject = subject;
}
}
What are the differences between variables a, b, and 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 and c all are declared without complaint from the IDE, but they all behave differently when setSubject is called.