复制 org.eclipse.jdt.core.dom.ParameterizedType 的类型参数

Copy type arguments of org.eclipse.jdt.core.dom.ParameterizedType

我正在尝试将类型参数从现有 org.eclipse.jdt.core.dom.ParameterizedType 复制到新创建的。 问题是您不能只将类型参数从一种类型添加到另一种类型,因为参数已经有父代。

这是我的代码:

AST ast = ... // some ast 
Type oldType = ... // existing type from ast
String name = ... // The name of the new type
Type newType = ast.newSimpleType(ast.newName(name));
if (oldType.isParameterizedType()) {
    ParameterizedType newParameterizedType = ast.newParameterizedType(newType);
    for (Object type : ((ParameterizedType) oldType).typeArguments()) {
         newParameterizedType.typeArguments().add(type); // throws illegal argument exception at org.eclipse.jdt.core.dom.ASTNode.checkNewChild(ASTNode.java:2087)
    }
    newType = newParameterizedType; // use parameterized type
}

如何复制旧类型的类型参数而不犯我当前在循环中犯的错误?

, using delete() solved that problem. This was originally proposed in this question。来自现有 ParameterizedType 的类型参数首先必须从 AST 中删除,然后再将它们添加到新创建的 ParameterizedType。这适用于每个 ASTNode.

这是我使用 delete() 的解决方案:

AST ast = ... // some ast 
Type oldType = ... // existing type from ast
String name = ... // The name of the new type
Type newType = ast.newSimpleType(ast.newName(name));
if (oldType.isParameterizedType()) {
    ParameterizedType newParameterizedType = ast.newParameterizedType(newType);
    for (Object type : ((ParameterizedType) oldType).typeArguments()) {
         type.remove(); // <-- THIS LINE SOLVES THE PROBLEM
         newParameterizedType.typeArguments().add(type);
    }
    newType = newParameterizedType; // use parameterized type
}