gpt4 book ai didi

java - 内部类操作的静态方法

转载 作者:搜寻专家 更新时间:2023-11-01 02:41:45 26 4
gpt4 key购买 nike

我正在研究算法第四版 (Sedgewick),并且对一些似乎要求为非静态节点实现静态方法的链表练习感到困惑。例如,

1.3.27 Write a method max() that takes a reference to the first node in a linked list as argument and returns the value of the maximum key in the list. Assume that all keys are positive integers, and return 0 if the list is empty.

1.3.31 Implement a nested class DoubleNode for building doubly-linked lists, where each node contains a reference to the item preceding it and the item following it in the list (null if there is no such item). Then implement static methods for the following tasks: insert at the beginning, insert at the end, remove from the beginning, remove from the end, insert before a given node, insert after a given node, and remove a given node.

据我了解(并由 SO 回答 herehere 确认)这是不可能的。正如预期的那样,如果我尝试在父类(super class)中编写静态方法,Eclipse 会出错:

public class DoublyLinkedList<Item> {

public static void insertStart(DoubleNode first) {
// implementation
}

private class DoubleNode {
Item item;
DoubleNode next;
DoubleNode previous;

}
}

(给出错误无法对非静态类型 DoubleNode 进行静态引用);或者在内部类中:

public class DoublyLinkedList<Item> {

private class DoubleNode {
Item item;
DoubleNode next;
DoubleNode previous;

public static void insertStart(DoubleNode first) {
// implementation
}
}
}

(给出错误方法 insertStart 不能声明为静态;静态方法只能在静态或顶级类型中声明)。

我可以将所需的方法编写为 DoublyLinkedList 类的实例方法,这对我来说似乎最自然。

但是,我觉得我可能在这里错过了一些重要的事情。作者明确指出方法应该是静态的,并且还建议将对第一个节点的引用作为参数(这对于实例方法来说是不必要的,因为该类将具有第一个节点的实例变量)。我错过了什么?

最佳答案

您可以将嵌套类设置为 static .您将失去拥有封闭父类实例的约束,但它将允许您对 DoubleNode 进行操作来自静态方法的 s:

// This will compile
public class DoublyLinkedList<Item> {

public static <T> void insertStart(DoublyLinkedList<T> list, DoubleNode<T> first) {
// implementation
}

private static class DoubleNode<E> {
E item;
DoubleNode<E> next;
DoubleNode<E> previous;

}
}

这里需要注意两件事:如您所见,在将内部类设为静态时,您需要为其提供自己的类型参数(在本例中为 E)。在您的代码中,您不需要这样做,因为任何 DoubleNode保证实例包含 DoublyLinkedList实例,它已经确定了 Item会的。

其次,您需要为静态方法引入一个类型参数(“<T>”),这样您就可以为两个参数强制使用相同的泛型类型。您也可以这样做并侥幸逃脱:

public static void insertStart(DoublyLinkedList<?> list, DoubleNode<?> first) {
...
}

如果您想知道,这也是在 JDK 的 LinkedList 中完成的方式。实现:

// Source : Oracle JDK 1.7.0_67 lib - inside LinkedList class
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;

Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}

作为旁注,我同意将这些方法编写为实例成员更为自然;这就是它通常在 OOP 库中完成的方式。我没有 Sedgewick 的书,但看起来他正试图同时教你嵌套类操作和列表实现;)

关于java - 内部类操作的静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31658813/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com