Well the difference is you cant use ?
in generic class declaration
public class MyClass<? extends SomeClass> {} // this isn't valid
The above declaration leads to compiler error.
A generic class is defined with the following format:
class name { /* ... */ } The type parameter section, delimited by angle brackets (<>), follows the class name. It specifies the type parameters (also called type variables) T1, T2, ..., and Tn.
public class MyClass<C extends SomeClass> {}
In this declaration C
is a type-argument which could be of type SomeClass or any of its SubClass's.
Example :
Class SomeOtherClass extends SomeClass {
}
MyClass clazz = new MyClass<SomeOtherClass>();
MyClass clazz = new MyClass<SomeClass>();