Конструкторы подкласса - Почему конструктор по умолчанию должен существовать для конструкторов подкласса? - PullRequest
3 голосов
/ 21 февраля 2012

Имеется случайный класс:

public class A<T> {
    public T t;

    public A () {}  // <-- why is this constructor necessary for B?
    public A (T t) {
        this.setT(t);
    }
    public T getT () {
        return this.t;
    }
    protected void setT (T t) {
        this.t = t;
        return;
    }
}

И расширенный класс:

public class B extends A<Integer> {
    public B (Integer i) {
        this.setT(i);
    }
}

Почему B требует, чтобы A имел пустой конструктор?Я бы предположил, что он хотел бы использовать аналогичный конструктор вместо конструктора по умолчанию.Я попытался скомпилировать без конструктора по умолчанию, но я получаю следующее сообщение без него ...

java.lang.NoSuchMethodError: A: method <init>()V not found at B.<init>

Может кто-нибудь объяснить, почему это так?

Ответы [ 3 ]

10 голосов
/ 21 февраля 2012

Важным моментом является понимание того, что первая строка любого конструктора должна вызывать супер-конструктор. Компилятор делает ваш код короче, вставляя super() под обложки, если вы сами не вызываете супер-конструктор.

Также, если у вас нет каких-либо конструкторов , автоматически будет вставлен пустой конструктор по умолчанию - здесь A() или B().

У вас есть ситуация, когда в вашем B-конструкторе нет super(...), поэтому компилятор вставляет сам вызов super(), но у вас do есть конструктор A с аргументами, так что конструктор A () по умолчанию не вставляется, и вы должны предоставить конструктор A () вручную или вызвать вместо него конструктор A (i). В этом случае я бы предложил иметь

public class B extends A<Integer> {
    public B (Integer i) {
        super(i);
    }
}
6 голосов
/ 21 февраля 2012

Вы можете использовать свой собственный конструктор в A, но вы должны вызывать его явно из конструктора B, например:

public B(Integer i) {
  super(i);
  ...
}

Если вы этого не сделаете, компилятор попытается создать экземпляр A, вызвав его конструктор по умолчанию.

2 голосов
/ 21 февраля 2012

Если вы не вызовете супер-конструктор, используя super(i) в качестве первой строки вашего конструктора, он неявно вызовет супер-конструктор по умолчанию

...