в синтаксисе Java, класс - PullRequest
       22

в синтаксисе Java, класс

49 голосов
/ 08 декабря 2011

Class<? extends Something>

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

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

Ответы [ 5 ]

41 голосов
/ 08 декабря 2011

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

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();

OR

DoSomething(List<? extends Bar> listOfBarObjects) {
    //internals
}
32 голосов
/ 08 декабря 2011

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

Я предлагаю прочитать « В чем различия между« универсальными »типами в C ++ и Java? », если вы хотите получить разницу между шаблонами и шаблонами.

10 голосов
/ 08 декабря 2011

Ты прав

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

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

Это также может быть класс Something, сам

4 голосов
/ 08 декабря 2011

Вы правы.

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

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

3 голосов
/ 08 декабря 2011

Вы правы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...