Не удается найти конструктор File() в java.io.File
Автор вопроса: Leo IzenОтветов: 7
Это, вероятно, очевидно, так что потерпите меня.
ДА, Я ЗНАЮ, ЧТО 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(){
}
}
Это дает мне ошибку, хотя я переопределяю конструктор.
ПРИМЕЧАНИЕ. Этот класс не закончен. Не комментируйте, почему мне это не нужно, или комментарий о том, что этот класс бесполезен. Я только начал писать это, прежде чем я получил эту ошибку.
Попробуйте сделать явный вызов конструктора File внутри вашего конструктора AbsRelFile, так как в тот момент, когда вы создаете объект AbsRelFile, он будет искать соответствующий конструктор super(), а в File такого конструктора нет (один без аргументов) Ross 06.08.2010
Невозможно переопределить конструктор суперкласса. Какие бы конструкторы ни были у суперкласса, они останутся там, независимо от того, какие конструкторы определяет ваш подкласс. И, таким образом, вы также не можете добавить новый конструктор в суперкласс (например, конструктор по умолчанию). Lajnold 06.08.2010
Я бы подумал об этом названии класса. Клавиши дешевые. Лично у меня какой-то ментальный диссонанс с AbsRelFile. Абсолютный относительный файл? Если бы я был клиентом этого класса, я бы понятия не имел, для чего он нужен из названия. Имена имеют значение - попробуйте еще раз. duffymo 06.08.2010
Поскольку вы не сделали явный вызов super(...) в своем конструкторе по умолчанию, он неявно пытается вызвать конструктор по умолчанию для суперкласса, который, как вы указываете, не существует в этом случае (случай супер является File). Решение вашей проблемы состоит в том, чтобы вызвать суперконструктор в конструкторе по умолчанию AbsRelFile(). Если вы не хотите предоставлять конструктор по умолчанию для своего класса, вам нужно будет вызвать super(...) с некоторыми значениями по умолчанию.
Ответ 2 · рейтинг 5 · samitgaur
Когда вы определяете конструктор, Java вставляет неявный вызов суперконструктора в самую первую строку конструктора. Итак, ваш конструктор эквивалентен:
private AbsRelFile(){
super();
}
Поскольку в суперклассе File нет конструктора по умолчанию, он выдает ошибку. Чтобы исправить это, вам нужно поместить явный вызов конструктора суперкласса в качестве первой строки:
private AbsRelFile(){
super("fileName");
}
Скорее всего, вам также придется определить некоторые подходящие параметры для конструктора AbsRelFile, которые вы можете передать в супервызов.
С другой стороны, конструкторы не могут быть переопределены. Поэтому неправильно говорить, что вы переопределяете конструктор класса Object. Вы просто определяете конструктор для класса AbsRelFile.
Ответ 3 · рейтинг 1 · John Flatness
Конструкторы по умолчанию вызывают конструктор суперкласса по умолчанию, если вы сами не вызываете суперконструктор.
Чтобы избежать этого, вызовите фактически определенный конструктор File.
Ответ 4 · рейтинг 1 · Tore A.
Java автоматически помещает вызов super() в ваш пустой конструктор, поэтому вы получаете ошибку.
Ответ 5 · Stephen C
Проблема в том, что ваш конструктор AbsRelFileпытается вызвать конструктор File без аргументов. То, что вы написали, эквивалентно
private AbsRelFile() {
super();
}
Вы должны убедиться, что вы явно вызываете один из File конструкторов, которые действительно существуют. Например:
private AbsRelFile() {
super("dummy");
}
Очевидно, вам нужно будет найти безопасный/безвредный/подходящий конструктор суперкласса и аргументы для использования в вашем конкретном случае использования. (Я понятия не имею, что такое AbsRefFile на самом деле... поэтому я не могу дать совет по этому поводу.)
Кроме того, вы не "переопределяете" конструкторы. Конструкторы никогда не наследуются в Java, поэтому переопределение здесь просто неприменимо. Вместо этого вы объявляете конструкторы в подклассе и связываете их с соответствующими конструкторами в непосредственном суперклассе с помощью явного вызова super(...)... или неявного вызова, который Java вставляет по умолчанию.
Ответ 6 · Stian Soiland-Reyes
Прежде всего, я надеюсь, что ваше поле "Файл 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 в первую очередь.
Ответ 7 · houman001
Чтобы объяснить ПОЧЕМУ в одной строке: когда вы определяете конструктор с параметром (как в классе File), компилятор Java НЕ БУДЕТ генерировать для вас конструктор по умолчанию.