Понимание класса <?>
Я натолкнулся на этот код:
public class RestfulAdage extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> set = new HashSet<Class<?>>();
set.add(Adages.class);
return set;
}
}
Я не понимаю, что означает Class<?>
.
Ответы
Ответ 1
Class<?>
относится к классу неизвестного типа. В нотации используется неограниченный общий, который не ограничивает тип класса, который можно добавить в коллекцию. Например, следующее не будет работать
Set<Class<String>> set = new HashSet<Class<String>>();
set.add(Adages.class); // type not allowed
Ответ 2
Класс является параметризуемым классом, поэтому вы можете использовать синтаксис Class, где T - тип. При написании класса вы объявляете объект класса, который может быть любого типа (? Является подстановочным знаком). Тип класса - это тип, содержащий метаинформацию о классе.
Всегда полезно относиться к родовому типу, указывая его конкретный тип, используя класс, которым вы пользуетесь этой практикой (вы знаете, что класс должен быть параметризуемым), но вы не ограничиваете свой параметр тем, что имеете определенного типа.
Справка о дженериках и подстановочных знаках: http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html
Ссылка на объект класса и отражение (особенность языка Java, используемого для самоанализа): http://java.sun.com/developer/technicalArticles/ALT/Reflection/
Ответ 3
В общем коде знак вопроса (?), называемый подстановочным знаком, представляет неизвестный тип. Подстановочный знак можно использовать в различных ситуациях: как тип параметра, поля или локальной переменной; иногда как возвращаемый тип (хотя лучше практика программирования более конкретна). Подстановочный знак никогда не используется в качестве аргумента типа для общего вызова метода, создания экземпляра универсального класса или супертипа.
В следующих разделах более подробно рассматриваются подстановочные знаки, в том числе верхние ограниченные подстановочные знаки, ограниченные подстановочные знаки и подстановочный знак.
для дополнительной информации нажмите здесь
Ответ 4
Это относится к герикам. Я предлагаю вам немного почитать. В принципе, вы знаете только во время выполнения, с каким типом объекта вы работаете. Например, Class может быть Integer, String или даже YourDefinedClassType
читать здесь http://java.sun.com/developer/technicalArticles/J2SE/generics/
Ответ 5
От: Wildcards
В общем коде знак вопроса (?), называемый подстановочным знаком, представляет неизвестный тип. Подстановочный знак можно использовать в различных ситуациях: как тип параметра, поля или локальной переменной; иногда как возвращаемый тип (хотя лучше практика программирования более конкретна). Подстановочный знак никогда не используется в качестве аргумента типа для общего вызова метода, создания экземпляра универсального класса или супертипа.
Проверьте ссылку, вы найдете более исчерпывающую документацию, примеры и т.д.
Ответ 6
Предположим, что у вас есть набор классов, которые относятся к разным типам, и у вас есть экземпляры разных классов. Поэтому, если вы хотите проверить, являются ли эти экземпляры instanceof одним из этих классов, вы можете выполнить итерацию через этот набор и выполнить задание. И для такой работы вам лучше использовать совершенно неограниченный набор:
public boolean checkClasses(Set<Class<?>> typeLessClassSet, Set instances){
while(typeLessClassSet.hasNext()){
Class c = typeLessClassSet.next();
while(instances.hasNext()){
Object o = instances.next();
if(o instanceof c)
return true;
}
}
return false;
}