JavaPoet проверяет, является ли TypeName экземпляром списка

В JavaPoet я могу получить TypeName из каждого класса, например, для класса List.

TypeName TYPE_LIST = ClassName.get(List.class);

Но как я могу теперь проверить, является ли данный TypeName экземпляром списка? Допустим, у меня есть метод, который возвращает List<String>. Я могу получить возвращаемый тип, используя:

TypeName returnTyoe = TypeName.get(method.getReturnType());

Как я могу проверить, возвращает ли этот метод List? Меня не волнует, является ли это List<String>, я только хочу знать, является ли это хотя бы List, и полностью игнорировать общий параметр.


person Cilenco    schedule 21.08.2018    source источник
comment
Вы всегда можете использовать Class.forName.   -  person Louis Wasserman    schedule 21.08.2018
comment
Как это поможет мне?   -  person Cilenco    schedule 21.08.2018


Ответы (3)


Нашел еще лучший способ. Для всех, кто также борется с этим, используйте приведенный ниже код:

TypeName TYPE_LIST = ClassName.get(List.class);
boolean isList = isFromType(type, TYPE_LIST)

public static boolean isFromType(TypeName requestType, TypeName expectedType) {
    if(requestType instanceof ParameterizedTypeName) {
        TypeName typeName = ((ParameterizedTypeName) requestType).rawType;
        return (typeName.equals(expectedType));
    }

    return false;
}
person Cilenco    schedule 21.08.2018
comment
Не могли бы вы уточнить, как это лучше? - person user2004685; 22.08.2018

Как вы правильно указали, вы не сможете узнать, является ли это List<String> из-за введите стирание.

Если вы просто хотите проверить, является ли это List или нет, вы можете сделать это,

return method.getReturnType().contains("java.util.List");
person user2004685    schedule 21.08.2018
comment
@Cilenco В чем проблема только return method.getReturnType().contains("List");? - person user2004685; 22.08.2018
comment
Это не сработает, если вы создадите собственный класс с именем List - person Cilenco; 22.08.2018

Это было мое решение этой проблемы (очень просто):

 public static boolean isParameterizedType(Class clazz) {
        String simpleName = clazz.getSimpleName();
        return parameterizedTypeSet.contains(simpleName);
    }

private static Set<String> parameterizedTypeSet = new HashSet<>();

    static {
        parameterizedTypeSet.add("List");
    }
person Sam Orozco    schedule 21.08.2018
comment
В этом коде не упоминается ClassName, и поэтому он не может ответить на вопрос. Определение того, является ли оно параметризованным, также не равнозначно определению того, является ли оно List. - person Matthew Read; 22.11.2020