Не удается найти конструктор File() в java.io.File

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

ДА, Я ЗНАЮ, ЧТО 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(){

    }
}

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

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


person Leo Izen    schedule 06.08.2010    source источник
comment
Попробуйте сделать явный вызов конструктора File внутри вашего конструктора AbsRelFile, так как в тот момент, когда вы создаете объект AbsRelFile, он будет искать соответствующий конструктор super(), а в File такого конструктора нет (один без аргументов)   -  person Ross    schedule 06.08.2010
comment
Невозможно переопределить конструктор суперкласса. Какие бы конструкторы ни были у суперкласса, они останутся там, независимо от того, какие конструкторы определяет ваш подкласс. И, таким образом, вы также не можете добавить новый конструктор в суперкласс (например, конструктор по умолчанию).   -  person Lajnold    schedule 06.08.2010
comment
Я бы подумал об этом названии класса. Клавиши дешевые. Лично у меня какой-то ментальный диссонанс с AbsRelFile. Абсолютный относительный файл? Если бы я был клиентом этого класса, я бы понятия не имел, для чего он нужен из названия. Имена имеют значение — попробуйте еще раз.   -  person duffymo    schedule 06.08.2010


Ответы (7)


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

person Nate W.    schedule 06.08.2010
comment
есть ли способ сделать так, чтобы я мог вызвать super.super() или что-то в этом роде? - person Leo Izen; 06.08.2010
comment
Чтобы вызвать суперконструктор, просто замените имя класса на super. Например, если бы было File(String filename), тогда ваш класс сделал бы что-то вроде super("theDefaultFile"). - person Nate W.; 06.08.2010
comment
есть ли способ сделать так, чтобы я мог вызвать super.super() или что-то в этом роде? - нет, вы не можете вызывать несуществующие методы/конструкторы. - person matt b; 06.08.2010

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

private AbsRelFile(){
    super();
}

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

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

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

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

person samitgaur    schedule 06.08.2010

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

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

person John Flatness    schedule 06.08.2010

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

person Tore A.    schedule 06.08.2010

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

private AbsRelFile() {
    super();
}

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

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

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

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

person Stephen C    schedule 06.08.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 в первую очередь.

person Stian Soiland-Reyes    schedule 06.08.2010

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

person houman001    schedule 06.08.2010