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

В синтаксисе Java, Class <? расширяет что-то>

Class<? extends Something>

Здесь моя интерпретация, это шаблон класса, но класс? означает, что имя класса не определено, и оно расширяет класс Something.

Если что-то не так с моей интерпретацией, дайте мне знать.

4b9b3361

Ответ 1

Ты почти прав. В принципе, Java не имеет понятия шаблонов (С++ имеет). Это называется дженериками. И это определяет общий класс Class<> с атрибутом generics, являющимся любым подклассом Something.

Я предлагаю прочитать "В чем разница между "родовыми" типами в С++ и Java?" если вы хотите получить разницу между шаблонами и дженериками.

Ответ 2

Здесь есть несколько путаных ответов, поэтому я попытаюсь это прояснить. Вы определяете общее как таковое:

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
}

Ответ 3

Вы правы

Определение состоит в том, что класс должен быть подтипом Something

Это то же самое, что и Class<T>, но есть условие, что T должно extends Something Или implements Something, как предложил Энтони Аккило

Он также может быть классом Something

Ответ 4

Вы правы.

В Java-генериках оператор ? означает "любой класс". Ключевое слово extends может использоваться для определения того, что для "любого класса, который расширяет/реализует Something (или Something).

Таким образом, у вас есть "Class какого-либо класса, но этот класс должен быть или расширять/реализовывать Something".

Ответ 5

Вы правы.

Однако обычно вы хотите назвать класс, который расширяет что-то и записывает, например. <E extends Something>. Если вы используете ?, вы не сможете ничего сделать с данным типом позже.