Что значит <t> (угловые скобки) означает в 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>, например, это означает "An ArrayList of Integer s." Многие классы используют дженерики, чтобы ограничить тип элементов в контейнере, например. Другим примером является HashMap<String, Integer>, что означает "карта с ключами String и значениями Integer".

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

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

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

Ответ 2

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

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

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

Ответ 3

Это действительно просто. Это новая функция, представленная в J2SE 5. Указание скобок angular после имени класса означает, что вы создаете временный тип данных, который может хранить данные любого типа.

Пример:

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"), там будет ошибка).

Ответ 4

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

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

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

Ответ 5

<> используется для указания дженериков в Java.

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

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

Ответ 6

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

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

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