在JavaPoet中,我可以像这样从每个类中获取一个TypeName作为List
类的示例。
TypeName TYPE_LIST = ClassName.get(List.class);
但是,我现在如何检查给定TypeName
是否是列表的实例? 假设我有一个返回List<String>
的方法。我可以通过以下方式获取返回类型:
TypeName returnTyoe = TypeName.get(method.getReturnType());
如何检查 tis 方法是否List
?我不在乎它是否是List<String>
我只想知道它是否至少是一个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;
}
正如您正确指出的那样,由于类型擦除,您将无法确定它是否是List<String>
。
如果您只是想检查它是否是List
,那么您可以这样做,
return method.getReturnType().contains("java.util.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");
}