gpt4 book ai didi

java - 在实现 Iterable 的 LinkedList 中使用 Generic

转载 作者:行者123 更新时间:2023-12-02 03:15:52 24 4
gpt4 key购买 nike

我想了解在什么情况下应该使用泛型。

假设我想实现一个可迭代的LinkedList。显然,LinkedList 应该具有通用的类型参数:

实现1:

public class LinkedList<E>{
private Node head;

private class Node{
private Node next;
private E e;
}
}

我的第一个问题:Node 是否也应该有类型参数 E?也就是说,上面的代码应该写成:

实现2:

public class LinkedList<E>{
private Node<E> head;

private class Node<E>{
private Node<E> next;
private E e;
}
}

两种实现都编译良好。我在我的教科书上看到过实现1。因此,看来实现2有点不必要。

接下来,我想实现Iterable。假设我们坚持实现 1,我们将得到:

实现3:

public class LinkedList<E> implements Iterable<E>{
private Node head;

private class Node{
private Node next;
private E e;
}

public Iterator<E> iterator(){
return new LinkedListIterator();
}

private class LinkedListIterator implements Iterator<E>{
private Node curr;

public boolean hasNext(){
return curr != null;
}
public E next(){
E element = curr.e;
curr = curr.next;
return element;
}
}

这是我在教科书中看到的标准实现。

我的第二个问题:既然我们没有 Node 的泛型类型,为什么我们不能对 Iterable 和 Iterator 也使用泛型类型呢?例如:

实现4:

public class LinkedList1<E> implements Iterable{
private Node head;

private class Node{
private Node next;
private E e;
}

public Iterator iterator(){
return new LinkedListIterator();
}

private class LinkedListIterator implements Iterator{
private Node curr = head;

public boolean hasNext(){
return curr != null;
}
public E next(){
E element = curr.e;
curr = curr.next;
return element;
}
}
}

最佳答案

第一个问题:你是完全正确的,使用泛型作为内部 Node类是不必要的。这是因为NodeLinkedList<E> 的一部分,所以它已经是隐式通用的,不需要为此做任何事情。有Node类是外部的一个单独的类 LinkedList ,您需要使其通用。

编辑:为了看得更深入一些,你的 Node类确实属于 LinkedList<E> 的每个实例。如果你有两个链表,那么list1.Nodelist2.Node不被视为同一类(就像 list1.headlist2,head 不是同一变量)。无论如何list1都是如此和list2具有相同或不同的元素类型。但这意味着 Node属于已具有类型参数 E 的对象,你可以使用 E里面Node (除非您重新声明它,在这种情况下您只能使用新声明的 E 并且它会掩盖 E 中的 LinkedList )。

如果 LinkedList 中有静态声明,以上内容并不适合他们。您已经知道静态字段由所有实例共享。你声明过private static class Node … ,该类将在所有链表之间共享。该逻辑仍然有效,但您必须将其声明为通用(当您希望它通用时;与 LinkedList 之外的类相同)。另外,如果您有 public static void main()LinkedList ,因为它是静态的,所以它不是通用的,即使 LinkedList是,正如您在评论中指出的,如果您实例化 LinkedList从这里开始,您应该给出一个类型参数。编辑结束。

第二个问题:正如您所发现的,您需要将类型参数传递给 IterableIterator接口(interface)。这是因为这些不在您的 LinkedList 范围内类,因此不属于类的通用性范围。另一方面,您的LinkedListIterator LinkedList 里面有一个非静态类因此是通用的,因为 LinkedList本身是并且不需要被声明为通用的。

关于java - 在实现 Iterable 的 LinkedList 中使用 Generic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40322092/

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