Представьте B
в качестве подкласса A
, то есть:
public class A {}
public class B extends A {}
Таким образом, следующий код является законным:
A a = new A();
A b = new B();
Но вы не может бросить параметризованных типов даже одного и того же общего класса, и даже если их аргументы типа в «это» отношения, то есть ниже код является незаконным:
MyClass<A> aClass = new MyClass<A>();
MyClass<A> bClass = new MyClass<B>(); //compile error
(см Oracle Generics Tutorial для более подробного описания о «является» отношения между параметризованных типов)
Таким образом, в этом случае следует использовать специальные символы:
MyClass<?> aClass = new MyClass<A>();
MyClass<?> bClass = new MyClass<B>();
или upper bounded wildcards:
MyClass<? extends A> aClass = new MyClass<A>();
MyClass<? extends A> bClass = new MyClass<B>();
В случае нетипичных объектов не требуются специальные символы. Вы всегда можете использовать Object (или другую верхнюю границу) и использовать для него значения неизвестных типов.
Что касается вашего примера, это не имеет смысла. MyClass<?>
- это с параметризованным типом, то есть конкретный тип, созданный путем передачи аргумента типа ?
, но это не объявление общего класса (см. generic type invocation). Декларация должна быть такая:
public class MyClass<T> {
T myVar;
}
Так T
типа параметр, тогда как групповой символ (или конкретный тип) представляет собой тип аргумента.
Я считаю, что вы просто используете 'Object myVar;' с неограниченным шаблоном. –