【发布时间】:2022-01-19 20:15:38
【问题描述】:
如何摆脱“无法实例化类型...”的错误?
我有一个名为Expression的抽象类:
public abstract class Expression {
private String expr;
Expression(){}
Expression(String expr){
this.expr = expr;
}
public String getExpr() {
return this.expr;
}
}
我有一个继承Expression的类:
public class Elements extends Expression {
private List<String> elements = new ArrayList<>();
Elements(List<String> elements){
this.elements = elements;
}
public List<String> getElements(){
return this.elements;
}
}
我还有一个类,它扩展了一个参数类型为Expression 的泛型类,以及一个返回类型为Expression 的方法(这个泛型类只是一个由解析器生成器生成的类):
public class AntlrToExpression extends ExprBaseVisitor<Expression> {
@Override
public Expression visitElements(ElementsContext ctx) {
ElementContext element;
List<String> elemList = new ArrayList<>();
ElementsContext elements = ctx.elements();
while(elements.getChildCount() > 1) {
element = elements.element();
elemList.add(element.getText());
elements = elements.elements();
}
element = elements.element();
elemList.add(element.getText());
return new Elements(elemList); // Here I get errors saying "Cannot instantiate the type Elements" and "Type mismatch: cannot convert from Elements to Expression"
}
}
以上所有类都定义在同一个包中。希望我的问题足够清楚。
【问题讨论】:
-
好的,刚刚发现原因是因为类名
Elements与Java内置类冲突。 -
嗨@rikki,我在本地重新创建了上面的类并创建了一个单元测试。我没有遇到“无法实例化”的问题。从技术上讲,您可以返回一个 Elements 实例,因为 Elements 是一个表达式。您能否在 AntlrToExpression 类中仔细检查您的导入声明以确保导入正确?
-
哈哈。我错过了你之前的评论 2 分钟。我有过时的记录:-)。
-
是的,我有一个错误的导入,这就是导致错误的原因。谢谢。
-
@rikki 我假设最后一个类是您使用 ANTLR 创建的?您使用的是哪个版本的 ANTLR?
标签: java compiler-errors type-mismatch