2

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

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

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

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

我如何检查 tis 方法是否重新运行 a List?我不在乎它是否是 aList<String>我只想知道它是否至少是 aList并完全忽略泛型参数。

4

3 回答 3

2

找到了更好的方法。对于每个也在努力使用以下代码的人:

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;
}
于 2018-08-21T21:13:40.550 回答
0

List<String>正如您正确指出的那样,由于类型 erasure,您将无法获得它是否是 a 。

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

return method.getReturnType().contains("java.util.List");
于 2018-08-21T20:13:09.593 回答
-1

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

 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");
    }
于 2018-08-21T20:03:51.817 回答