В настоящее время я изучаю Java, и недавно меня поставили в тупик угловые скобки (<>). Что именно они означают?
publicclassPool<T>{ publicinterfacePoolFactory<T>{ public T createObject(); } this.freeObjects = newArrayList<T>(maxsize) }
Что <T> означает? Означает ли это, что я могу создать объект типа T?
Переведено автоматически
Ответ 1
<T> является универсальным и обычно может быть прочитан как "типа T". Это зависит от типа слева от <>, что это на самом деле означает.
Я не знаю, что такое Pool или PoolFactory, но вы также упомянули ArrayList<T>, который является стандартным классом Java, поэтому я расскажу об этом.
Обычно вы не увидите там "T", вы увидите другой тип. Так, например, если вы видите ArrayList<Integer>, это означает "ArrayList из Integers". Многие классы используют generics, например, для ограничения типа элементов в контейнере. Другой пример - HashMap<String, Integer>, что означает "карта с String ключами и Integer значениями".
Ваш пример пула немного отличается, потому что там вы определяете класс. Итак, в этом случае вы создаете класс, который кто-то другой мог бы создать с определенным типом вместо T. Например, я мог бы создать объект типа Pool<String>, используя ваше определение класса. Это означало бы две вещи:
У моего Pool<String> был бы интерфейс PoolFactory<String> с createObject методом, который возвращает Strings.
Внутри Pool<String> будет содержать ArrayList количество строк.
Это отличная новость, потому что в другое время я мог бы прийти и создать Pool<Integer> который использовал бы тот же код, но имел Integer везде, где вы видите T исходный код.
Ответ 2
Это действительно просто. Это новая функция, представленная в J2SE 5. Указание угловых скобок после имени класса означает, что вы создаете временный тип данных, который может содержать данные любого типа.
Вместо <T> вы можете написать что угодно, и это будет работать точно так же. Попробуйте написать <ABC> вместо <T>.
Это просто для удобства:
<T> относится к любому типу
<E> как тип элемента
<N> как тип числа
<V> как значение
<K> как ключ
Но вы можете называть это как угодно, на самом деле это не имеет значения.
Более того, Integer, String, Boolean и т.д. Являются классами-оболочками Java, которые помогают в проверке типов во время компиляции. Например, в приведенном выше коде obj имеет тип String, поэтому вы не можете добавить к нему какой-либо другой тип (попробуйте obj.add(1), это выдаст ошибку). Аналогично, obj1 имеет Integer тип, вы не можете добавить к нему какой-либо другой тип (попробуйте obj1.add("hello"), появится ошибка).
Ответ 3
Это связано с generics в Java. Если я упомянул ArrayList<String> это означает, что я могу добавить объект только строкового типа в этот ArrayList.
Два основных преимущества generics в Java заключаются в следующем:
Сокращение количества приведений в вашей программе, тем самым уменьшая количество потенциальных ошибок в вашей программе.
Повышение четкости кода
Ответ 4
называется универсальным типом. Вы можете создать экземпляр пула объектов следующим образом:
PoolFactory<Integer> pool = newPool<Integer>();
Общим параметром может быть только ссылочный тип. Таким образом, вы не можете использовать примитивные типы, такие как int, double, char или другие примитивные типы.