【问题标题】:Linked List Java structure (Generics)链表 Java 结构(泛型)
【发布时间】:2015-11-25 21:48:41
【问题描述】:

我正在尝试在 java 中实现 LinkedList。结构简单:控制器(BList类),节点,节点的信息组件。 现在我想整合泛型的使用:节点的信息组件应该是泛型的。 我无法理解以下错误。如果我指定了泛型类型<E>,为什么编译器需要 Object 类型?

Test.java:7: error: cannot find symbol
        System.out.println(newNode.getElement().getUserId());   
                                               ^
  symbol:   method getUserId()
  location: class Object
1 error

这是我的代码。提前感谢您的帮助。

public class BList<E> {
    private Node head;

    public BList() {
        this.head = null;
    }

    public Node insert(E element) {
        Node<E> newNode = new Node<E>(element);

        newNode.setSucc(this.head);
        this.head = newNode;

        return newNode; 
    }
}

class Node<E> {
    private Node succ;

    private E element;

    public Node(E element) {
        this.succ = null;
        this.element = element;
    }

    public void setSucc(Node node) {
        this.succ = node;
    }

    public void setElement(E element) {
        this.element = element;
    }

    public E getElement() {
//      return this.element; // ?
        return (E) this.element;
    }
}

class Element {
    private int userId;

    public Element(int userId) {
        this.userId = userId;
    }

    public int getUserId() {
        return this.userId;
    }
}      

public class Test {
    public static void main(String[] args) {

        BList<Element> bList = new BList<Element>();

        Node newNode = bList.insert(new Element(1));
// error happens here!      
        System.out.println(newNode.getElement().getUserId());

    }
}

【问题讨论】:

  • 只是一个想法:在 BList 实现中,您似乎将 Node 类作为包私有而将头节点作为私有。那么为什么要返回在插入方法中创建的节点呢?这不是暴露 BList 的内部表示吗?

标签: java generics linked-list


【解决方案1】:

您在 2 个地方使用了 Node 的原始形式:

  1. BListinsert 方法的返回类型。返回 Node&lt;E&gt; 而不是 Node
  2. newNodemain 中的声明。将其声明为 Node&lt;Element&gt; 而不是 Node

因为使用了Node 的原始形式,所以Object 现在是返回类型,它没有getUserId 方法。泛型前代码(Java 1.5 之前)会在调用getUserId 之前将getElement 的结果转换为Element,但进行上述更改是使用泛型解决此问题的方法。

【讨论】:

  • insert 也应该返回一个 Node
  • @AmirAfghani:如果你想学究气,insert 应该返回一个 boolean 来表示它的成功,或者什么都不返回。但是,对于示例,您是完全正确的。
  • @AmirAfghani 我在第 1 项中使用了错误的方法。已更正。谢谢。
  • 我同意@Makoto - 我不是想学究气。
  • 谢谢大家,我已经修复了代码。你是对的@Makoto,官方Java LikedList 的add 方法返回一个布尔值。这是在这种情况下使用泛型的正确方法吗?
猜你喜欢
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多