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

WhaClass - это разница между a Class<?>и Class a;объявлением.

  • Class<?> b;
  • Class // An unknown class (raw type) Class<?> // An unknown class (generic version) Class<String> // The String class

java,generics,

37

Ответов: 4


37 принят

Это то же самое, что и со всеми родовыми и необработанными типами:

String

В этом специальном случае нет никакой практической разницы между ними Classи Classпотому, что оба они обозначают неизвестный класс. В зависимости от существующих объявлений компилятор может требовать тип общего типа вместо необработанного типа.

Но: Начиная с Java 1.5, вы должны использовать общую форму, где это возможно. Tясно заявляет, что вы имеете в виду «неизвестный класс», Classcleary утверждает, что вы имеете в виду String.classкласс. Сырой Classможет означать и то, и другое .

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


10

Класс javadoc :

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

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


2

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


1

«это похоже на старый код или код, написанный кем-то, кто еще не изучил дженерики». Это правильное утверждение. Класс (произносится как «класс неизвестных»), то есть класс, тип которого соответствует чему-либо. По понятным причинам это называется типом дикой карты.

например:

public void drawAll(List<Shape> shapes) {
    for (Shape s: shapes) {
        s.draw(this);
   }
}

type rules говорят, что drawAll () может быть вызван только в точках списка Shape: он не может, например, быть вызван, скажем, a List<Circle>. Это печально, так как весь метод делает, это читать фигуры из списка, поэтому его можно было бы также вызвать на a List<Circle>.

Мы действительно хотим, чтобы метод принял список любой формы.

public void drawAll (List <? extends Shape> shapes) {

}

подробнее: http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

Java, генерики,
Похожие вопросы
Яндекс.Метрика