I am used to java generics, e.g.
class B {}
class A<T extends B> {
  T t;
  T getT() {
    return t;
  }
}
Now, what exactly is the meaning in the following piece of code in this context?
class C {
  A<?> a;
  A<?> getA() {
    return a;
  }
}
The code compiles, but I wonder why the compile is fine with using A<?>? I would expect the compiler to complain that A must be used in the same way either on the attribute level (a1) or on the class level (a2):
class C<T extends B> {
   A<? extends B> a1;
   A<? extends B> getA1() {
     return a1;
   };
  A<T> a2;
  A<T> getA2() {
    return a2;
  }
 }
So my guess is that A<?> is only syntactic sugar, but the meaning is equal to A<? extends B>? However, many answers on stack overflow regarding the notation Something<?> means Something<? extends Object> which then would mean that all those answers are wrong?
But it is not possible to assign a A<?> typed variable to one of type A<? extends B>, which makes clear that the compiler is unaware of the fact that it is impossible to create an A<X> where X is not a subclass of B.
Theoretical, the A<?> just means unknown type argument, but the compiler should still know that the type argument must be a subclass of B because of the type parameter definition of A. But it seems that the compiler does not take into account this? Why?
