Вопрос-ответ

What does (angle brackets) mean in Java?

Что означает (угловые скобки) в Java?

В настоящее время я изучаю Java, и недавно меня поставили в тупик угловые скобки (<>). Что именно они означают?

public class Pool<T>{
public interface PoolFactory<T>{
public T createObject();
}
this.freeObjects = new ArrayList<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. Указание угловых скобок после имени класса означает, что вы создаете временный тип данных, который может содержать данные любого типа.

Пример:

class A<T>{
T obj;
void add(T obj){
this.obj=obj;
}
T get(){
return obj;
}
}
public class generics {
static<E> void print(E[] elements){
for(E element:elements){
System.out.println(element);
}
}

public static void main(String[] args) {
A<String> obj=new A<String>();
A<Integer> obj1=new A<Integer>();
obj.add("hello");
obj1.add(6);
System.out.println(obj.get());
System.out.println(obj1.get());

Integer[] arr={1,3,5,7};
print(arr);
}
}

Вместо <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 заключаются в следующем:


  1. Сокращение количества приведений в вашей программе, тем самым уменьшая количество потенциальных ошибок в вашей программе.

  2. Повышение четкости кода

Ответ 4

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

PoolFactory<Integer> pool = new Pool<Integer>();

Общим параметром может быть только ссылочный тип. Таким образом, вы не можете использовать примитивные типы, такие как int, double, char или другие примитивные типы.

2023-10-31 21:46 java generics