2013-12-20 4 views
0

Я читал о дженериках в Java. В разделе «Подстановочный знак» в учебнике ниже все примеры приведены для параметризованных методов. Это заставило меня задуматься, почему нет примера для подстановочного объявления с параметрическим типом. http://docs.oracle.com/javase/tutorial/java/generics/wildcards.htmlКонфигурируемый подстановочный знак в Java

Имеет ли это смысл? Что это значит?

public class MyClass<?>{ 
    ? myVar; 
} 
+0

Я считаю, что вы просто используете 'Object myVar;' с неограниченным шаблоном. –

ответ

0

Представьте 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 типа параметр, тогда как групповой символ (или конкретный тип) представляет собой тип аргумента.

1

С дженериков, вы бы просто сделать:

public class MyClass<T>{ 
    T myVar; 
} 

Синтаксис ? используется в основном, когда вы хотите, чтобы дать больше контекста - то есть ? exteds SomeType