javaparser:获取方法返回类型的泛型类,如list< myclass>

dldeef67  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(842)

我正在使用java解析器库处理一个java源文件。
我在分析的源代码中遇到了这种情况:

List<Allergen> getList() {
        return EnumSet.allOf(Allergen.class).stream()
                .filter(this::isAllergicTo)
                .collect(Collectors.toList());
    }

我需要访问列表返回类型的泛型类(本例中为过敏原)
我正在分析器中使用voidvisitoradapter类的扩展
下面是代码摘录:

public class PlaceholderNormalizer extends VoidVisitorAdapter<String> {

 ...
 ...

 @Override
    public void visit(MethodDeclaration n, String arg) {
        logger.debug("MethodDeclaration: {}", n.getName().asString());
        logger.debug(" --- " + n.getTypeAsString());  // prints: List<Allergen>

    // DO SOME STUFF
        super.visit(n, arg);
    }

  ...
  ...
}

我可以使用 n.getType() 但是,我不知道如何检索过敏原类。
拜托,我需要帮助

8yoxcaq7

8yoxcaq71#

如果是这种方法 n.getType 将返回的示例 ClassOrInterfaceType . 要获取泛型参数,可以将其作为此类型获取并使用 ClassOrInterfaceType::getTypeArguments 方法:

@Override
public void visit(MethodDeclaration n, String arg) {
    Type type = n.getType();

    if(type instanceof ClassOrInterfaceType) {
        ClassOrInterfaceType classOrInterfaceType = type.asClassOrInterfaceType();
        Optional<NodeList<Type>> typeArguments = classOrInterfaceType.getTypeArguments();

        //list of arguments might have different length
        typeArguments.ifPresent(types -> System.out.println(types.get(0)));
    }
        // DO SOME STUFF
     super.visit(n, arg);
}

这将打印 Allergen .

相关问题