Как мне наследовать от пользовательского класса LinkedList? - PullRequest
1 голос
/ 16 апреля 2019

Мне нужно наследовать от IntegerLinkedList, а также создавать новую переменную, специфичную для StringAndIntegerLinkedList.Чего мне не хватает?

class IntegerLinkedList {
    int payload;
    IntegerLinkedList next;

    public IntegerLinkedList(int payload, IntegerLinkedList next) {
        this.payload = payload;
        this.next = next;
    }

    class StringAndIntegerLinkedList extends IntegerLinkedList {
        String stringPayload;

    public StringAndIntegerLinkedList(String stringPaylod, int payload, IntegerLinkedList next) {
        this.stringPayload = stringPaylod;
        this.payload = payload;
        this.next = next;
    }

У меня также есть сеттеры и геттеры для каждого поля в каждом классе.

Сообщение об ошибке:

StringAndIntegerLinkedList.java:4: error: constructor IntegerLinkedList in class IntegerLinkedList cannot be applied to given types;
    public StringAndIntegerLinkedList(String stringPaylod, int payload, IntegerLinkedList next) {
                                                                                                ^
  required: int,IntegerLinkedList
  found: no arguments
  reason: actual and formal argument lists differ in length
1 error

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Здесь:

public IntegerLinkedList(int payload, IntegerLinkedList next) {

Это конструктор, который Java-компилятор хочет вызвать из вашего производного конструктора. Обратите внимание, что он имеет два параметра.

Но производный конструктор имеет три параметра. Так как же теперь должен использовать компилятор!

Одно решение: поместите super(payload, next); в качестве первого оператора в этот производный конструктор.

Важной частью является то, что любой конструктор должен вызывать другой конструктор в том же классе или конструктор суперкласса. Если вы пропустите этот явный вызов, компилятор попытается вставить его для вас. Что он не может сделать, когда вещи не складываются.

Теорию, стоящую за этим, см., Например, здесь .

1 голос
/ 16 апреля 2019

Возможно, вам не хватает явного вызова конструктора родительского класса? Попробуйте добавить это в качестве первой строки конструктора подкласса:

super(payload, next);

Это необходимо, когда родительский класс не имеет конструктора без аргументов, который компилятор может вызывать автоматически. Это обеспечивает правильную инициализацию родительского класса.

...