Что означает <T>(угловые скобки) в Java? - PullRequest
116 голосов
/ 07 июля 2011

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

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

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

Ответы [ 6 ]

129 голосов
/ 07 июля 2011

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

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

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

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

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

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

20 голосов
/ 07 июля 2011

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

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

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

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

9 голосов
/ 07 июля 2011

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

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

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

6 голосов
/ 07 июля 2011

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

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

Помимо вышеприведенного учебного пособия Часто задаваемые вопросы об общих чертах Angelika Langers - отличный ресурс по теме.

5 голосов
/ 20 мая 2016

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...