Що означає <T> (кутові дужки) у Java?


139

В даний час я вивчаю Java, і останнім часом наткнувся на кутові дужки (<>). Що саме вони означають?

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

Що <T>означає? Чи означає це, що я можу створити об’єкт типу T?


4
Мені важко проаналізувати ваш код. Немає відступу для початку, і є дві відкриті дужки і лише одна закрита. Чи T createObjectповинен бути всередині Pool або 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-клас, тому я поговорю з цим.

Зазвичай ви там не побачите "T", ви побачите інший тип. Отже, якщо ви бачите, ArrayList<Integer>наприклад, це означає "An ArrayListof Integers". Багато класів використовують дженерики для обмеження типу елементів, наприклад. Інший приклад - HashMap<String, Integer>це "карта з Stringключами та Integerзначеннями".

Приклад вашого басейну дещо інший, тому що там ви визначаєте клас. Отже, у цьому випадку ви створюєте клас, який би хтось інший міг інстанціювати з певним типом замість T. Наприклад, я міг би створити об’єкт типу Pool<String>за допомогою визначення вашого класу. Це означало б дві речі:

  • У мене Pool<String>буде інтерфейс PoolFactory<String>із createObjectметодом, який повертає Strings.
  • Внутрішнє значення Pool<String>містило б ArrayListрядки.

Це чудова новина, тому що в інший час я міг би зійти і створити такий, Pool<Integer>який би використовував той самий код, але Integerтам, де ви бачите Tджерело.


3
Одне з найкращих пояснень, які я бачив до цих пір :) Дуже вдячний !.
Suhas Chikkanna

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>про це, то я можу додати до цього ArrayList лише об'єкт типу String.

Дві основні переваги дженериків на Java:

  1. Скорочення кількості трансляцій у вашій програмі, зменшення кількості потенційних помилок у вашій програмі.
  2. Поліпшення ясності коду

11

називається родовим типом. Ви можете інстанціювати об'єктний пул так:

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

Загальний параметр може бути лише еталонним типом. Таким чином, ви не можете використовувати примітивні типи, такі як int, double або char або інші примітивні типи.


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 для створення обох списків, і ми передаємо тип "Співробітник" або "Компанія" за допомогою кутових дужок. Маючи один загальний клас, вміти обробляти декілька типів даних, скорочується наявність багатьох класів, які виконують подібні завдання. Також дженерики допомагають зменшити помилки, надаючи всім сильний тип, що допомагає компілятору вказати на помилки. Вказавши тип для ArrayList, компілятор видасть помилку, якщо ви спробуєте додати службовця до списку компаній або навпаки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.