В настоящее время я изучаю Java и недавно был озадачен угловыми скобками (<>). Что именно они имеют в виду?
public class Pool<T>{
public interface PoolFactory<T>{
public T createObject();
}
this.freeObjects = new ArrayList<T>(maxsize)
}
Что <T>
значит? Значит ли это, что я могу создать объект типа T
?
T createObject
должно быть в бассейн или PoolFactory? Гдеthis.freeObjects = ...
должен быть? Это отдельный пример? Это незаконно иметь там; это должно быть внутри метода.<>
(алмазном операторе), которую можно использовать, например,List<Integer> list = new ArrayList<>();
посетите docs.oracle.com/javase/7/docs/technotes/guides/language/… .Ответы:
<T>
является универсальным и обычно может читаться как «типа T». Это зависит от типа слева от <>, что это на самом деле означает.Я не знаю, что такое
Pool
илиPoolFactory
является, но вы также упоминаетеArrayList<T>
, что это стандартный класс Java, поэтому я поговорю об этом.Обычно вы не увидите там буквы «Т», вы увидите другой тип. Так что, если вы видите,
ArrayList<Integer>
например, это означает «AnArrayList
ofInteger
s». Например, многие классы используют обобщения для ограничения типа элементов в контейнере. Другой примерHashMap<String, Integer>
, который означает «карта сString
ключами иInteger
значениями».Ваш пример пула немного отличается, потому что там вы определяете класс. Таким образом, в этом случае вы создаете класс, экземпляр которого может создать кто-то другой, с конкретным типом вместо T. Например, я мог бы создать объект типа,
Pool<String>
используя определение вашего класса. Это будет означать две вещи:Pool<String>
может иметь интерфейсPoolFactory<String>
сcreateObject
методом, который возвращаетString
s.Pool<String>
будет содержатьArrayList
строки.Это отличная новость, потому что в другое время я мог бы прийти и создать такой,
Pool<Integer>
который бы использовал тот же код, но имелInteger
везде , где вы видитеT
в исходном коде.источник
Это действительно просто. Это новая функция, представленная в J2SE 5 . Задание угловых скобок после имени класса означает, что вы создаете временный тип данных, который может содержать данные любого типа.
Пример:
Вместо этого
<T>
вы можете написать что угодно, и все будет работать так же. Попробуйте написать<ABC>
вместо<T>
.Это просто для удобства:
<T>
упоминается как любой тип<E>
как тип элемента<N>
как тип номера<V>
как ценность<K>
как ключНо вы можете назвать это как угодно, это не имеет значения.
Кроме того,
Integer
,String
, иBoolean
т.д., обертка классы Java , которые помогают при проверке типов во время компиляции. Например, в приведенном выше коде,obj
имеет типString
, так что вы не можете добавить любой другой тип к нему (попробуйтеobj.add(1)
, это приведет к ошибке). Точно так жеobj1
относится кInteger
типу, вы не можете добавить к нему другой тип (попробуйтеobj1.add("hello")
, ошибка будет).источник
Это связано с дженериками в Java. Если я упомянул,
ArrayList<String>
это означает, что я могу добавить только объект типа String к этому ArrayList.Два основных преимущества дженериков в Java:
источник
называется универсальным типом. Вы можете создать экземпляр объекта Pool следующим образом:
Универсальный параметр может быть только ссылочным типом. Таким образом, вы не можете использовать примитивные типы, такие как int или double, char или другие примитивные типы.
источник
<>
используется для обозначения обобщений в Java.T
является параметром типа в этом примере. И нет: создание экземпляров - это одна из немногих вещей, с которыми вы не можете справитьсяT
.Помимо учебника, указанного выше, Angelika Langers Generics FAQ - отличный ресурс по этой теме.
источник
Универсальные классы - это тип класса, который принимает тип данных в качестве параметра при его создании. Этот параметр типа указывается с использованием угловых скобок, и тип может изменяться каждый раз, когда создается новый экземпляр класса. Например, давайте создадим ArrayList для объектов Employee и еще один для объектов Company
Вы заметите, что мы используем один и тот же класс ArrayList для создания обоих списков, и мы передаем тип Employee или Company, используя угловые скобки. Наличие одного универсального класса позволяет обрабатывать несколько типов данных, что снижает количество классов, выполняющих аналогичные задачи. Обобщения также помогают сократить количество ошибок, придавая всему строгий тип, который помогает компилятору указывать на ошибки. Указав тип для ArrayList, компилятор выдаст ошибку, если вы попытаетесь добавить Сотрудника в список Компании или наоборот.
источник