Не удается найти конструктор File () в java.io.File - PullRequest
0 голосов
/ 06 августа 2010

Это, наверное, очевидно, так что терпите меня.

ДА, Я ЗНАЮ, ЧТО java.io.File не имеет конструктора по умолчанию.
Проблема в том, что когда я пытаюсь расширить java.io.File, он говорит: «Не удается найти конструктор File () в java.io.File», хотя я переопределяю конструктор по умолчанию в java.lang.Object.

Вот мой код:
AbsRelFile.java

import java.io.File;
public class AbsRelFile  extends File {
    File f;
    private AbsRelFile(){

    }
}

Это дает мне ошибку, хотя я переопределяю конструктор.

ПРИМЕЧАНИЕ. Этот класс не закончен. Не комментируйте, почему мне это не нужно, или комментируйте, как этот класс бесполезен. Я только начал писать, прежде чем получил эту ошибку.

Ответы [ 7 ]

8 голосов
/ 06 августа 2010

Поскольку вы не сделали явный вызов super(...) в конструкторе по умолчанию, он неявно пытается вызвать конструктор по умолчанию для суперкласса, который, как вы указали, в данном случае не существует ( случай супер быть File). Решением вашей проблемы является вызов супер-конструктора в вашем конструкторе AbsRelFile() по умолчанию. Если вы не хотите предоставлять конструктор по умолчанию для вашего класса, вам нужно вызвать super(...) с некоторыми значениями по умолчанию.

5 голосов
/ 06 августа 2010

Когда вы определяете конструктор, Java вставляет неявный вызов супер-конструктора в качестве самой первой строки конструктора.Таким образом, ваш конструктор эквивалентен:

private AbsRelFile(){
    super();
}

Поскольку в суперклассе File нет конструктора по умолчанию, он выдает ошибку.Чтобы исправить это, вам нужно явно указать конструктор суперкласса в качестве первой строки:

private AbsRelFile(){
    super("fileName");
}

Скорее всего, вам придется определить некоторые подходящие параметры для конструктора AbsRelFile, который выможет перейти к супер вызову.

С другой стороны, конструкторы не могут быть переопределены.Поэтому неправильно утверждать, что вы переопределяете конструктор класса Object.Вы просто определяете конструктора для AbsRelFile класса.

1 голос
/ 06 августа 2010

Java автоматически вызывает super () в вашем пустом конструкторе, поэтому вы получаете ошибку.

1 голос
/ 06 августа 2010

Конструкторы по умолчанию вызывают конструктор по умолчанию суперкласса, если вы не заставляете суперконструктора вызывать себя.

Чтобы избежать этого, вызовите фактически определенный конструктор File.

0 голосов
/ 06 августа 2010

Чтобы объяснить ПОЧЕМУ в одной строке: Когда вы определяете конструктор с параметром (как в классе File), компилятор Java НЕ будет генерировать конструктор по умолчанию для вас.

0 голосов
/ 06 августа 2010

Прежде всего, я надеюсь, что ваше поле «Файл f» не связано с попыткой доступа к суперклассу, а связано с «Rel» или «Abs».

Другие авторы правильно указали, что ваш неявный конструктор по умолчанию (AbsRelfile ()) будет пытаться вызвать super () - который не существует. Поэтому единственное решение - создать конструктор, который передаст некоторые допустимые аргументы.

Если вы пытаетесь «обернуть» весь класс java.util.File (например, при создании собственного исключения), вам, вероятно, следует предоставить оболочку для каждого из исходных конструкторов. Современные IDE, такие как Eclipse, должны щелкнуть правой кнопкой мыши.

Обратите внимание, что File не требует, чтобы данное имя файла существовало, в частности, оно не существует, когда вы хотите выполнять такие операции, как file.mkdir ().

Если вам нужен фактический временный файл для работы, вы всегда можете сделать что-то вроде:

public class AbsRelFile() {
     public AbsRelFile() {
           super(File.createTempFile("AbsRelFile", "tmp").getAbsolutePath());
     }
}

.. но я озадачен тем, почему вы хотите сначала создать подкласс File.

0 голосов
/ 06 августа 2010

Проблема в том, что ваш AbsRelFile конструктор пытается вызвать конструктор no-args File. То, что вы написали, эквивалентно

private AbsRelFile() {
    super();
}

Вы должны убедиться, что вы явно вызываете один из File конструкторов, которые существует . Например:

private AbsRelFile() {
    super("dummy");
}

Очевидно, вам нужно будет найти безопасный / безвредный / подходящий конструктор суперкласса и аргументы для использования в вашем конкретном случае использования. (Я понятия не имею, что на самом деле должен означать AbsRefFile ... поэтому я не могу дать совет по этому поводу.)

В сторону - вы не «переопределяете» конструкторы. Конструкторы никогда не наследуются в Java, поэтому переопределение здесь просто не применяется. Вместо этого вы объявляете конструкторы в подклассе и заставляете их связываться с соответствующими конструкторами в непосредственном суперклассе через явный вызов super(...) ... или неявный, который Java вставляет по умолчанию.

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