Sobes.tech
Middle

Как може да се определи типът на параметъра, използван в обобщен клас, по време на изпълнение?

sobes.tech AI

Отговор от AI

В Java, поради изтриването на типове (type erasure) по време на компилация, информацията за типовете на параметрите на генеричните класове не се запазва в байткода, така че не е възможно директно да се определи типът на параметъра по време на изпълнение.

Въпреки това, има няколко начина да получите тази информация:

  1. Използване на класа TypeToken или подобни конструкции: При създаване на екземпляр на генеричен клас, може да се предаде обект Class<T> или да се използва анонимен подклас, за да се запази информацията за типа.

  2. Рефлексия с използване на ParameterizedType: Ако генеричният клас запазва информация за типа в поле или конструктор, тя може да бъде получена чрез рефлексия.

Пример с предаване на Class<T>:

public class GenericClass<T> {
    private Class<T> type;

    public GenericClass(Class<T> type) {
        this.type = type;
    }

    public void printType() {
        System.out.println("Тип на параметъра: " + type.getName());
    }
}

GenericClass<String> instance = new GenericClass<>(String.class);
instance.printType(); // Ще изведе: Тип на параметъра: java.lang.String

Затова, за да определите типа на параметъра по време на изпълнение, обикновено е необходимо да го предадете или запазите явно, тъй като стандартните механизми на Java не позволяват да се получи поради изтриването на типове.