В чем разница между объявлением 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