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

139

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

public class Pool<T>{
    public interface PoolFactory<T>{
        public T createObject();
    }
    this.freeObjects = new ArrayList<T>(maxsize)
}

Что <T>значит? Значит ли это, что я могу создать объект типа T?

Laughy
источник
4
Мне трудно разобрать ваш код. Там нет отступа для начала, и есть две открытые скобки и только одна закрытие. Является ли T createObjectдолжно быть в бассейн или PoolFactory? Где this.freeObjects = ...должен быть? Это отдельный пример? Это незаконно иметь там; это должно быть внутри метода.
mgiuca
Если кто-то ищет информацию о <>(алмазном операторе), которую можно использовать, например, List<Integer> list = new ArrayList<>();посетите docs.oracle.com/javase/7/docs/technotes/guides/language/… .
Пшемо

Ответы:

161

<T>является универсальным и обычно может читаться как «типа T». Это зависит от типа слева от <>, что это на самом деле означает.

Я не знаю, что такое Poolили PoolFactoryявляется, но вы также упоминаете ArrayList<T>, что это стандартный класс Java, поэтому я поговорю об этом.

Обычно вы не увидите там буквы «Т», вы увидите другой тип. Так что, если вы видите, ArrayList<Integer>например, это означает «An ArrayListof Integers». Например, многие классы используют обобщения для ограничения типа элементов в контейнере. Другой пример HashMap<String, Integer>, который означает «карта с Stringключами и Integerзначениями».

Ваш пример пула немного отличается, потому что там вы определяете класс. Таким образом, в этом случае вы создаете класс, экземпляр которого может создать кто-то другой, с конкретным типом вместо T. Например, я мог бы создать объект типа, Pool<String>используя определение вашего класса. Это будет означать две вещи:

  • My Pool<String>может иметь интерфейс PoolFactory<String>с createObjectметодом, который возвращает Strings.
  • Внутренне, он Pool<String>будет содержать ArrayListстроки.

Это отличная новость, потому что в другое время я мог бы прийти и создать такой, Pool<Integer>который бы использовал тот же код, но имел Integerвезде , где вы видите Tв исходном коде.

mgiuca
источник
3
Одно из лучших объяснений, которые я видел до сих пор :) Очень ценится!
Сухас Чикканна
34

Это действительно просто. Это новая функция, представленная в 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"), ошибка будет).

Рутурадж Моханти
источник
23

Это связано с дженериками в Java. Если я упомянул, ArrayList<String>это означает, что я могу добавить только объект типа String к этому ArrayList.

Два основных преимущества дженериков в Java:

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

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

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

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

Rafiek
источник
9

<>используется для обозначения обобщений в Java.

Tявляется параметром типа в этом примере. И нет: создание экземпляров - это одна из немногих вещей, с которыми вы не можете справиться T.

Помимо учебника, указанного выше, Angelika Langers Generics FAQ - отличный ресурс по этой теме.

Йоахим Зауэр
источник
8

Универсальные классы - это тип класса, который принимает тип данных в качестве параметра при его создании. Этот параметр типа указывается с использованием угловых скобок, и тип может изменяться каждый раз, когда создается новый экземпляр класса. Например, давайте создадим ArrayList для объектов Employee и еще один для объектов Company

ArrayList<Employee> employees = new ArrayList<Employee>();
ArrayList<Company> companies = new ArrayList<Company>();

Вы заметите, что мы используем один и тот же класс ArrayList для создания обоих списков, и мы передаем тип Employee или Company, используя угловые скобки. Наличие одного универсального класса позволяет обрабатывать несколько типов данных, что снижает количество классов, выполняющих аналогичные задачи. Обобщения также помогают сократить количество ошибок, придавая всему строгий тип, который помогает компилятору указывать на ошибки. Указав тип для ArrayList, компилятор выдаст ошибку, если вы попытаетесь добавить Сотрудника в список Компании или наоборот.

Adiii
источник