Class<? extends Something>
Здесь моя интерпретация, это шаблон класса, но класс? означает, что имя класса не определено, и оно расширяет класс Something.
Если что-то не так с моей интерпретацией, дайте мне знать.
Class<? extends Something>
Здесь моя интерпретация, это шаблон класса, но класс? означает, что имя класса не определено, и оно расширяет класс Something.
Если что-то не так с моей интерпретацией, дайте мне знать.
Ты почти прав.
В принципе, Java не имеет понятия шаблонов (С++ имеет).
Это называется дженериками.
И это определяет общий класс Class<>
с атрибутом generics, являющимся любым подклассом Something
.
Я предлагаю прочитать "В чем разница между "родовыми" типами в С++ и Java?" если вы хотите получить разницу между шаблонами и дженериками.
Здесь есть несколько путаных ответов, поэтому я попытаюсь это прояснить. Вы определяете общее как таковое:
public class Foo<T> {
private T t;
public void setValue(T t) {
this.t = t;
}
public T getValue() {
return t;
}
}
Если вы хотите, чтобы универсальный Foo всегда расширял класс Bar, вы объявляете его как таковой:
public class Foo<T extends Bar> {
private T t;
public void setValue(T t) {
this.t = t;
}
public T getValue() {
return t;
}
}
?
используется при объявлении переменной.
Foo<? extends Bar>foo = getFoo();
ИЛИ
DoSomething(List<? extends Bar> listOfBarObjects) {
//internals
}
Вы правы
Определение состоит в том, что класс должен быть подтипом Something
Это то же самое, что и Class<T>
, но есть условие, что T
должно extends Something
Или implements Something
, как предложил Энтони Аккило
Он также может быть классом Something
Вы правы.
В Java-генериках оператор ?
означает "любой класс". Ключевое слово extends
может использоваться для определения того, что для "любого класса, который расширяет/реализует Something
(или Something
).
Таким образом, у вас есть "Class
какого-либо класса, но этот класс должен быть или расширять/реализовывать Something
".
Вы правы.
Однако обычно вы хотите назвать класс, который расширяет что-то и записывает, например. <E extends Something>
. Если вы используете ?
, вы не сможете ничего сделать с данным типом позже.