【问题标题】:Java error: "Cannot instantiate the type..." and type mismatchJava 错误:“无法实例化类型...”和类型不匹配
【发布时间】: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


【解决方案1】:

信用诚

你不能实例化一个抽象类。

你有两个选择:

  • 从类声明中删除抽象,或
  • 创建另一个类来扩展可以实例化的表达式。

【讨论】:

  • 我正要发布类似的东西。错误本身清楚地与问题相关"Cannot instantiate the type Elements" ..."
  • 扩展Garage?哈哈,我不这么认为。
  • 我正在实例化一个扩展抽象类的类,而不是抽象类本身。这合法吗?
  • @rikki 如错误消息所示,您有两个问题。 1) 实例化问题,以及 2) 类型不匹配问题。 Elements 对象是 Expression 类型。但是,并非所有 Expression 对象都属于 Elements 类型。
【解决方案2】:

也许在您的代码中的某个地方,您尝试实例化 Expression 对象。由于 Expression 类是抽象的,因此无法实例化。但是这些类型的错误会在 IDE 和编译时被捕获。

如果包含异常的堆栈跟踪会有所帮助。

【讨论】:

  • 这不是答案。这是一条评论。将来,请使用 cmets 部分发布此类 cmets,并等到问题细化后再发布(最终)答案。
  • 对不起,我是新手,没有足够的学分给 cmets。
  • 不过,不要发布 cmets 作为答案。我不相信这种做法,但其他人会否决您的“答案”,并且没有礼貌地告诉您原因。只是在你能提供一个真正的答案之前不要发帖。如果您不使用“也许”之类的词,这可能是一个真正的答案。要自信(这是实际问题),但也要花时间寻找并指出问题所在。这就是 Brentspine 实际上所做的。
  • 是的。在提供答案之前发表评论以获得澄清将是可行的方法。
  • 我只是想帮你。我已经存在足够长的时间了,知道有些人在这里是如何运作的。我讨厌看到人们因为试图提供帮助而失去声誉积分。这就是为什么我没有否决你的答案。我不那样操作。
【解决方案3】:

您在 visitElements 中返回 Expression,但尝试返回 new Element()

【讨论】:

  • 这是问题的第二部分(类型不匹配)
  • 删除此答案并使用此信息更新您的原始答案
  • @hfontanez 知道如何自己解决这个问题吗?或者你只是在评论
  • 我同意你的说法。您的两个帖子似乎都正确。
猜你喜欢
  • 2014-03-16
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多