【问题标题】:Java type casting problems when overrideing equals()覆盖 equals() 时的 Java 类型转换问题
【发布时间】:2021-02-19 01:47:02
【问题描述】:

我正在尝试为我的 Vertex 类覆盖 equals() 方法。每个顶点都有一个字段String source

如果参数 other_vertex 不是 Vertex 实例,我希望 equals() 返回 false。 如果参数other_vertex是一个Vertex实例,我想测试源字符串是否相等(默认String equals(),如果true返回true,如果false返回false。

我的错误代码是

@Override
    public boolean equals(Object other_vertex) {
        if (!(other_vertex instanceof Vertex)) { 
            return false; 
        } 
        else {
            return (this.getSourceString()).equals(other_vertex.getSourceString());
        }
    }

这给了我第 7 行的编译器错误“方法 getSourceString() 未定义对象类型”。 getSourceString() 是为顶点正确定义的。

如何编写代码以使编译器识别只有在other_vertex 是顶点时才会执行此操作?

【问题讨论】:

  • 你必须投射它,比如((Vertex)other_vertex).getSourceString()
  • 表达式(other_vertex instanceof Vertex) 不会隐式转换other_vertex,它只检查类型。必须在else-block:Vertex asVertex = (Vertex) other_vertex; 中显式地转换它。或者,对于 Java 14+,可以使用模式匹配:} else (other_vertex instanceof Vertext asVertex) { ... }。顺便说一句:在Java中,变量名应该写成camelCase,而不是snake_case

标签: java casting overriding equals


【解决方案1】:

通知

public boolean equals(Object other_vertex) {
                      ^^^^^^

您必须将 other_vertex 强制转换为 Vertex 才能访问该方法。

return (this.getSourceString()).equals(((Vertex)other_vertex).getSourceString());

这是安全的,因为您已经确定向下转换是有效的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    相关资源
    最近更新 更多