Java 方法参数:括号中的类型声明?

Java method arguments: type declaration in parentheses?

提问人:jmc 提问时间:10/3/2023 更新时间:10/4/2023 访问量:78

问:

我正在实现一个数据结构。我编写了一个方法和一个帮助程序:LinkedListDequeequals

  1. 检查 object 是否是 类 的实例。如果为 true,oLinkedListDeque
  2. 检查 in 中的每个节点是否等于 deque 中的节点。othis

我写了一个帮助程序,因为我需要一种方法在两个对象之间而不是在 deque 和 .当我第一次编写 equals_helper 方法时,我省略了类型声明中的括号。经过测试,没有工作。IDE 建议我在类型声明两边加上一个括号(即 到),奏效了。2LinkedListDequethisoobjectequals_helper(LinkedListDeque o)equals_helper((LinkedListDeque) o)

我试图找到一些关于我在这里所做的事情的文档,但我没有背景知识来知道我在搜索什么。这个概念叫什么,我是否在Java OOP原则的上下文中正确地应用了它,有没有更好的方法来做到这一点?

public boolean equals(Object o) {
    if (!(o instanceof LinkedListDeque)) {
        return false;
    } else {
        return this.equals_helper((LinkedListDeque) o);
    }
}

public boolean equals_helper(LinkedListDeque L) {
    if (L.size() != this.size()) {
        return false;
    } else {
        Node orig_curr = sentinel.next;
        Node curr = L.sentinel.next;
        while (orig_curr.item != null || curr.item != null) {
            if (orig_curr.item == curr.item) {
                curr = curr.next;
                orig_curr = orig_curr.next;
            } else return curr.next.item == null && orig_curr.next.item == null;
        }
    }
    return true;
}
Java 强制转换 参数 类型声明

评论

4赞 markspace 10/3/2023
这是一个演员阵容。w3schools.com/java/java_type_casting.asp
1赞 Federico klez Culloca 10/3/2023
你用“铸造”来标记这个问题,所以你已经知道了。你到底在问什么?
2赞 Federico klez Culloca 10/3/2023
因为不是有效的 java 语法。就这么简单。.equals_helper(LinkedListDeque o)
1赞 markspace 10/3/2023
因为是类型,所以不能传递给 。 是 的一种类型,但不是(总是)的 类型。oObjectequals_helperLinkedListDequeObjectObjectLinkedListDeque
1赞 markspace 10/3/2023
否,不是方法调用的特定语法。您可以添加一行,然后将其传递给方法,该方法也会执行相同的操作。LinkedListDeque list = (LinkedListDeque) o;equals_helper

答:

1赞 WJS 10/4/2023 #1

由于参数 to 的类型是,因此需要将其强制转换为要使用的类型。否则,它可能是不同的类型。在这种情况下.但从 Java 14 开始,您可以按如下方式进行操作:equalsObjectLinkedListDeque

public boolean equals(Object o) {
    if (o instanceof LinkedListDeque lld)) {
       return this.equals_helper(lld);
    }
    return false;
}

如果返回 true,则会自动将其转换为正确的类型,然后将其放入其中。不需要显式强制转换。instanceoflld

注意:您应该首先检查对象是否相同。if(this == obj) return true;

当你覆盖等于时,也要覆盖,这也是一个好习惯。hashCode

0赞 Himanshu Gupta 10/4/2023 #2

我想你可能在问题中输入了错误。 当你说:当我第一次编写 equals_helper 方法时,我省略了类型声明中的括号

然后你提到 IDE 建议我在类型声明周围放一个括号(即 equals_helper(LinkedListDeque o) to equals_helper((LinkedListDeque) o))

因此,我看到的 equals_helper((LinkedListDeque) o)) 不是equals_helper方法的一部分,而是当您在等于方法中调用equals_helper方法时。(equals_helper(LinkedListDeque L) 是参数名称为 L 而不是 O 的帮助程序方法的声明。

所以,也许你通常指的是你的整体等于/equals_helper逻辑。

假设您正在谈论调用equals_helper方法等于: this.equals_helper((LinkedListDeque) o) 你的问题是关于上面的括号的。正如 WJS 已经回答的那样......

正如你所看到的,你的 equals 方法声明:

public boolean equals(对象 o)

o 是 Class Object 的对象。equal_helper方法需要 LinkedListDeque 类型或其子类的参数。由于您已经验证了“o instanceof LinkedListDeque”,因此您可以将其转换为 LinkedListDeque,这就是您将对象转换为类型的方式(将类型放在对象变量前面/左侧的括号中)。

要回答你的“这个概念叫什么,我是否在Java OOP原则的上下文中正确地应用了它,有没有更好的方法来做到这一点?”部分。我建议通读 CoreJava 第 1 卷主题 5.2.2 The equals Method 一整套指南,可以更有效地纠正 equals 方法,并且那里还更详细地讨论了转换。我在这里提到其中的一些。

可以包括 null 指针检查 if (o == null) 返回 false;

快速参考检查 if (this == o) 返回 true;

如果要在 LinkedListDeque 对象和非子类型的对象之间进行比较,则可以使用 getClass() 方法 if (getClass()!=o.getClass()) 返回 false

请注意,您使用的是单向或下游工作的运算符实例,它不会保持对称性:

假设 A 是定义了 equals 的类。B 扩展 A。 在 a 中定义的 equals 方法中,检查是 - A 的 o 实例,假设 a 是 A 的对象,b 是 B 的对象。instanceof 运算符的结果对 a.equals(b) 成立,但对 b.equals(a) 成立,因此结果不对称。为了避免这种情况,您可以使用 getClass(),它也会使 a.equals(b) 为 false,并且仅在两个对象都是 A 或 B 类型时才成立。

引用书中的话: 5.2.3 相等性测试和继承 Java 语言规范要求 Equals 方法具有以下属性: 它是反身的。 。 。 对称、传递、一致。

但这取决于您的要求:)