В чем разница между объявлением Class
и Class<?>
.
-
Class a;
-
Class<?> b;
В чем разница между объявлением Class
и Class<?>
.
Class a;
Class<?> b;
Он аналогичен всем родовым и необработанным типам:
Class // An unknown class (raw type)
Class<?> // An unknown class (generic version)
Class<String> // The String class
В этом специальном случае нет существенной разницы между Class
и Class<?>
, потому что оба они обозначают неизвестный класс. В зависимости от существующих объявлений компилятор может потребовать общий тип вместо необработанного типа.
Но: Так как Java 1.5 вы должны использовать общую форму, где это возможно. Class<?>
четко заявляет, что вы имеете в виду "неизвестный класс", Class<String>
cleary утверждает, что вы имеете в виду класс String
. Сырой Class
может означать и то, и другое.
В конце концов, это не имеет большого значения для компилятора, но имеет огромное значение для того, чтобы сделать намерения вашего кода более понятными и удобными.
Класс javadoc:
Параметры типа:
T
- тип класса, моделируемого этим объектомClass
. Например, типString.class
равенClass<String>
. ИспользуйтеClass<?>
, если моделируемый класс неизвестен.
Использование параметра Class
без параметра type аналогично использованию любого универсального класса (Map
, List
и т.д.) без параметра типа - либо это использование предыдущего поколения, либо только сегмент код, который не заботится о неконтролируемом типе.
Класс <?>
показывает, что вы намеренно пишете Java-код на 5 уровней, который не знает и не заботится о том, с каким классом вы имеете дело. Оставляя это, он выглядит как старый код или код, написанный кем-то, кто еще не изучил дженерики.
"он выглядит как старый код или код, написанный кем-то, кто еще не изучил дженерики". Это правильное утверждение. Класс (произносится как "класс неизвестных" ), то есть класс, тип которого соответствует чему-либо. По понятным причинам он назвал тип wild-card.
например:
public void drawAll(List<Shape> shapes) {
for (Shape s: shapes) {
s.draw(this);
}
}
Правила типа говорят, что drawAll() можно вызывать только в списках точно Shape
: его нельзя, например, вызывать, скажем, a List<Circle>
. Это печально, так как весь метод делает, читает фигуры из списка, поэтому его можно так же назвать на List<Circle>
.
Мы действительно хотим, чтобы метод принимал список любой формы.
public void drawAll (List <? extends Shape> shapes) {
}
подробнее: http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html