【问题标题】:JavaPoet check if TypeName is instance of ListJavaPoet 检查 TypeName 是否是 List 的实例
【发布时间】:2018-08-22 05:34:11
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你总是可以使用Class.forName
  • 这对我有什么帮助?

标签: java javapoet


【解决方案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;
}

【讨论】:

  • 您能否详细说明这是一种更好的方法
【解决方案2】:

正如您正确指出的那样,由于type erasure,您将无法知道它是否是List<String>

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

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

【讨论】:

  • @Cilenco return method.getReturnType().contains("List"); 有什么问题?
  • 如果你创建一个自己的名为 List 的类,这将不起作用
【解决方案3】:

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

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

【讨论】:

  • 这段代码没有提到ClassName,因此不可能回答这个问题。判断是否参数化也不等于判断是否为List
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-31
相关资源
最近更新 更多