JavaPoet 检查 TypeName 是否是 List 的实例

JavaPoet check if TypeName is instance of List

在 JavaPoet 中,我可以像这样从每个 Class 中获取一个 TypeName 作为 List class.

的示例
TypeName TYPE_LIST = ClassName.get(List.class);

但是我现在如何检查给定的 TypeName 是否是列表的实例?假设我有一个 return 是 List<String> 的方法。我可以通过使用获得 return 类型:

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

如何检查此方法是否返回 List?我不在乎它是否是 List<String> 我只想知道它是否至少是 List 并完全忽略通用参数。

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

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

正如您正确指出的那样,由于 type erasure.

,您无法判断它是否是 List<String>

如果你只是想检查它是否是 List 那么你可以这样做,

return method.getReturnType().contains("java.util.List");

找到了更好的方法。对于同样为使用以下代码而苦苦挣扎的每个人:

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