этим утром я столкнулся с этим кодом, и у меня нет абсолютно никакой идеи, что это означает. Кто-либо может объяснить меня, что делает их <T>
представить? Например:
public class MyClass<T>
...
some bits of code then
private Something<T> so;
private OtherThing<T> to;
private Class<T> c;
Спасибо
Вы наткнулись на «дженерики». Они очень хорошо объяснены в этом руководстве .
Короче говоря, они позволяют указать, какой тип содержит класс хранилища, например Список
или Набор
. Если вы напишете Set
, вы заявили, что этот набор должен содержать только String
s, и получите ошибку компиляции, если вы попытаетесь поместить туда что-то еще:
Set<String> stringSet = new HashSet<String>();
stringSet.add("hello"); //ok.
stringSet.add(3);
^^^^^^^^^^^ //does not compile
Кроме того, еще одним полезным примером того, что могут делать дженерики, является то, что они позволяют более точно определять абстрактный класс:
public abstract class AbstClass<T extends Variable> {
Таким образом, расширяющиеся классы не должны расширять переменную
, но им нужно для расширения класса, расширяющего Variable
.
Соответственно, метод, который обрабатывает AbstClass
, может быть определен следующим образом:
public void doThing(AbstClass<?> abstExtension) {
где ?
- это подстановочный знак, означающий «все классы, которые расширяют AbstClass
] с некоторой переменной
".
Вы видите обобщенные шаблоны Java , которые позволяют параметризировать классы и методы другими классами. Это особенно полезно при создании контейнерных классов, поскольку избавляет вас от необходимости создавать отдельные классы для «списка целых чисел», «списка строк» и т. Д. Вместо этого вы можете иметь единственный »список некоторого типа T, где T - это переменная ", а затем вы можете создать экземпляр списка для определенного типа T. Обратите внимание, что универсальные шаблоны Java не совсем то же самое, что типы шаблонов в C ++; Дженерики Java фактически используют одно и то же определение класса, но добавляют неявное приведение типов (сгенерированное компилятором) и дополнительную проверку типов. Однако разные экземпляры фактически используют один и тот же точный тип (это называется стиранием), где параметризованные типы заменяются на Object. Подробнее об этом можно прочитать по ссылке.
То, что вы видите здесь, называется Generics. Они были представлены в Java в версии 1.5.
Вы можете прочитать о них здесь и здесь . Надеюсь это поможет.
Поскольку никто еще не упомянул об этом, на сайте Анжелики Лангер есть очень подробное руководство / FAQ / руководство по дженерикам. ].
Представьте, что вы пишете класс List или Array. Этот класс должен содержать элементы неизвестного типа. Как вы это делаете? На этот вопрос отвечает
Generics . Те
, которые вы видите, можно прочитать как какой-то тип
. С помощью дженериков вы можете написать класс MyList
, что в данном контексте означает список, содержащий некоторый тип
.
В качестве примера использования объявите список для хранения целых чисел, MyList
, или строк, MyList
, или один класс, который вы написали сами. MyList
.