【问题标题】:Inheriting from implementation of LinkedList to a SortedLinkedList, access private Node从LinkedList的实现继承到SortedLinkedList,访问私有节点
【发布时间】:2018-03-12 15:04:14
【问题描述】:

我对 Java 很陌生,我正在尝试自己实现链接列表,然后将其扩展到排序链接列表。

我认为我的问题是继承自 LinkedList 和 > 的 SortedLinkedList 类无权访问私有节点启动;在链表中。这是代码的简化。

我首先创建自己的 List 类接口

interface List<T> {
public int size();            
public void add(int pos, T x);  
public void add(T x);                 
public T get(int pos);             
public T remove();                   
}

并将其保存为 List.java 然后我创建我的链表类

class LinkedList<T> implements List<T> {

//Starting point of the Linked List
private Node start;

public class Node {
    T x;
    Node next;

    public Node(T x) {
        this.x= x;
    }
    public T getValue(){
      return x;
    }
}

//Here is implementations of all the methods from List<T> and some ohers
}

这一切都按预期工作,我已经测试了所有方法并确认它们正在工作。但是现在我想使用这个类来创建另一个继承自 LinkedList 并且也使用 Comparable 的类,这样我就可以在输入值时对它们进行排序。我完成了所有设置并创建了课程

public class SortedLinkedList<T extends Comparable<T>> extends LinkedList<T>{


//And here I try to do something like 
@Override
public void add(T x){
    //add logic to add a element
}

}

在这里我尝试了很多不同的东西。但无论我如何创建方法,它都不会添加任何新节点。我认为问题与无法从 LinkedList 开始访问私有节点的方法有关。因为我可以使用 LinkedList 中的 add 函数,以同样的方式添加元素

@Override
public void add(T x){
super.add(x);
}

当我尝试将 LinkedList 中的方法直接添加到 SortedLinkedList 中并将其更改为

public class SortedLinkedList<T extends Comparable<T>>{

}

我确实设法使用了 compareTo() 并覆盖了 add 方法。

我知道这很长,但我希望有人能启发我。我确实尝试在 LinkedList 中创建一个 getter 和 setter 方法,但我没有设法让它以任何方式编译而没有错误。

【问题讨论】:

  • private 访问修饰符意味着该类之外的任何内容(嵌套类的特定情况除外)都可以访问该字段。将其设置为protected 以允许子类访问。
  • 好吧,你问为什么你的方法 LinkedList.add 不起作用,但你没有分享它的实现。
  • 将其更改为受保护似乎有效。 Rob 我没有分享 add 实现,因为我知道它在 LinkedList 内部以及当我使用 SortedLinkedList 类中的 super.add() 调用它时都可以使用
  • @Siesta 从你描述的行为来看,它的实现是不正确的。

标签: java linked-list sortedlist


【解决方案1】:

正如 JLS 所述 (https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.2):

Members of a class that are declared private are not inherited by subclasses of 
that class. Only members of a class that are declared protected or public are 
inherited by subclasses declared in a package other than the one in which the 
class is declared.

您很可能在 LinkedList 类的 add() 实现中使用私有 start 变量。

要解决此问题,只需将访问修饰符更改为受保护:

protected Node start;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 2012-08-16
    • 1970-01-01
    • 2012-01-04
    • 2010-10-15
    • 1970-01-01
    • 2020-02-11
    相关资源
    最近更新 更多