Как решить 'Неявный супер конструктор classA () не виден.Должен ли явно вызывать другой конструктор? - PullRequest
11 голосов
/ 11 октября 2010

У меня есть класс 'ClassA', который имеет закрытый конструктор.

public final class ClassA{
  private ClassA{
  }

  public static void main(String[] arg) }{
  ;
  ;
  ;
  }
}

Теперь я расширяю класс 'ClassA' [ final Ключевое слово удаляется перед этим]

public class ClassB extends ClassA{
     public static void main(String[] arg) }{
      ;
      ;
      ;
      }

}

Теперь я получаю Implicit super constructor classA() is not visible. Must explicitly invoke another constructor.Что это значит и как решить эту проблему?

Примечание Я не могу изменить спецификатор доступа конструктора ClassA.

Ответы [ 4 ]

7 голосов
/ 11 октября 2010

Я бы предложил композицию вместо наследования (может, это то, что разработчик ClassA предназначен для использования в классе. Пример:

public class ClassB {
   private ClassA classA;

   ClassB() {
       // init classA
       ...
   }

   public ClassA asClassA() {
       return classA;
   }

   // other methods and members for ClassB extension
}

Вы можете делегировать методы от ClassB до ClassA или переопределить их.

7 голосов
/ 11 октября 2010

Изменить видимость конструктора ClassA с private на protected.

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

3 голосов
/ 11 октября 2010

Java неявно создаст конструктор без параметров для ClassB, который вызовет super (). В вашем случае конструктор в ClassA не виден, следовательно, вы получаете ошибку. Изменение видимости на общедоступное или защищенное устранит ошибку.

2 голосов
/ 11 октября 2010

Изменение private ClassA{} на protected ClassA{} звучит как хорошее решение.

Родительский конструктор всегда вызывается в дочернем классе: неявно или нет. Итак, ваше ClassB определение эквивалентно

public ClassB extends ClassA {
    public ClassB() {
        super();
    }

    // all other methods you have go here...
}

Если единственный конструктор ClassA является закрытым, его нельзя вызвать из ClassB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...