Подтвердить что ты не робот

Разница между классом и классом <?>

В чем разница между объявлением Class и Class<?>.

  • Class a;
  • Class<?> b;
4b9b3361

Ответ 1

Он аналогичен всем родовым и необработанным типам:

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 может означать и то, и другое.

В конце концов, это не имеет большого значения для компилятора, но имеет огромное значение для того, чтобы сделать намерения вашего кода более понятными и удобными.

Ответ 2

Класс javadoc:

Параметры типа: T - тип класса, моделируемого этим объектом Class. Например, тип String.class равен Class<String>. Используйте Class<?>, если моделируемый класс неизвестен.

Использование параметра Class без параметра type аналогично использованию любого универсального класса (Map, List и т.д.) без параметра типа - либо это использование предыдущего поколения, либо только сегмент код, который не заботится о неконтролируемом типе.

Ответ 3

Класс <?> показывает, что вы намеренно пишете Java-код на 5 уровней, который не знает и не заботится о том, с каким классом вы имеете дело. Оставляя это, он выглядит как старый код или код, написанный кем-то, кто еще не изучил дженерики.

Ответ 4

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