JavaPoet检查TypeName是否为List的实例

时间:2018-08-21 19:59:45

标签: java javapoet

在JavaPoet中,我可以从每个这样的类中获取TypeName作为List类的示例。

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

但是我现在如何检查给定的TypeName是否是List的实例?假设我有一个返回List<String>的方法。我可以使用以下方法获取返回类型:

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

如何检查tis方法是否催生List?我不在乎它是否为List<String>,我只想知道它是否至少为List,而完全忽略通用参数。

3 个答案:

答案 0 :(得分:1)

找到了更好的方法。对于也为此苦苦挣扎的每个人,请使用以下代码:

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;
}

答案 1 :(得分:0)

这是我解决这个问题的方法(非常简单):

 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");
    }

答案 2 :(得分:0)

正如您正确指出的那样,由于type erasure,您将无法获得它是否为makemigrations

如果您只是想检查它是否为List<String>,就可以这样做,

List