В Java вы можете использовать универсальные типы для создания классов и методов, которые могут работать с различными типами данных. Чтобы создать универсальный класс, вы используете угловые скобки и параметр типа после имени класса. Например, следующий класс определяет универсальный класс Stack, который может хранить данные любого типа:

public class Stack<T> {
    private T[] items;
    private int top;
    public Stack(int capacity) {
        items = (T[]) new Object[capacity];
        top = -1;
    }
    public void push(T item) {
        items[++top] = item;
    }
    public T pop() {
        return items[top--];
    }
    public boolean isEmpty() {
        return top == -1;
    }
}

В этом примере класс Stack имеет параметр типа T, который можно заменить любым типом данных. Класс имеет массив типа T для хранения данных и методы для добавления и извлечения данных из стека и из него.

Чтобы использовать класс Stack с данными определенного типа, вы указываете тип при создании экземпляра класса. Например, чтобы создать Stack целых чисел, вы должны написать:

Stack<Integer> intStack = new Stack<>(10);

Угловые скобки указывают, что класс Stack следует использовать с типом Integer, а ключевое слово new создает новый экземпляр класса с емкостью 10.

Вы также можете использовать общие методы в Java. Чтобы создать универсальный метод, вы используете угловые скобки и параметр типа перед возвращаемым типом метода. Например, следующий метод определяет общий метод max, который может найти максимальное значение двух объектов:

public static <T extends Comparable<T>> T max(T a, T b) {
    if (a.compareTo(b) > 0) {
        return a;
    } else {
        return b;
    }
}

В этом примере метод max имеет параметр типа T, который расширяет интерфейс Comparable и обеспечивает возможность сравнения объектов, передаваемых методу, друг с другом. Метод сравнивает два объекта и возвращает объект с более высоким значением.

Чтобы использовать метод max с данными определенного типа, вы указываете тип в угловых скобках при вызове метода. Например, чтобы найти максимальное из двух целых чисел, вы должны написать:

int maxInt = max(5, 10);

Угловые скобки указывают, что метод max следует использовать с типом Integer, и метод возвращает целое число с более высоким значением.

Универсальные типы — это мощная функция Java, позволяющая создавать гибкий и повторно используемый код. Их можно использовать с классами и методами для работы с различными типами данных, а также для обеспечения безопасности типов и предотвращения ошибок программирования.