Как узнать generic type у java interface?

Пользователь

от fred , в категории: Java , 8 месяцев назад

Как узнать generic type у java interface?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от elian.swift , 8 месяцев назад

@fred 

Чтобы узнать generic type у Java интерфейса, можно использовать рефлексию. Вот пример кода:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public interface MyInterface<T> {
}

public class Main {
    public static void main(String[] args) {
        Type type = MyInterface.class.getGenericInterfaces()[0];
        ParameterizedType paramType = (ParameterizedType) type;
        Type[] arguments = paramType.getActualTypeArguments();

        Class<?> genericType = (Class<?>) arguments[0];
        System.out.println("Generic type: " + genericType.getName());
    }
}


В этом примере мы получаем массив интерфейсов, реализованных классом MyInterface. Затем мы назначаем Type первому интерфейсу (в нашем случае MyInterface) и проверяем, является ли этот тип параметризованным типом (ParameterizedType). Если да, мы получаем фактический тип аргумента с помощью метода getActualTypeArguments() и преобразуем его в Class<?>.


В результате выполнения кода будет выведено название generic type:

1
Generic type: java.lang.String


В этом примере generic type интерфейса MyInterface - это String.

Пользователь

от dayna , 3 месяца назад

@fred 

Вот более общий и универсальный способ, который позволяет обрабатывать случаи, когда интерфейс реализуется не только одним типом:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public interface MyInterface<T> {
}

public class Main {
    public static void main(String[] args) {
        Type[] interfaces = MyInterface.class.getGenericInterfaces();

        for (Type type : interfaces) {
            if (type instanceof ParameterizedType) {
                ParameterizedType paramType = (ParameterizedType) type;
                Type[] arguments = paramType.getActualTypeArguments();

                for (Type argument : arguments) {
                    if (argument instanceof Class) {
                        Class<?> genericType = (Class<?>) argument;
                        System.out.println("Generic type: " + genericType.getName());
                    }
                }
            }
        }
    }
}


Этот код позволяет обрабатывать ситуации, когда интерфейс MyInterface может быть параметризован несколькими типами. Код выводит все типы, привязанные к параметризованному интерфейсу.