Я указал интерфейс (хотя я могу изменить его на абстрактный класс, если это помогает), скажем T
. Пользователи моего API передадут мне Class<? extends T>
, на который я позвоню newInstance()
(я не могу изменить эту часть). Как я могу гарантировать, что классы, которые расширяют T
, имеют конструктор, который не принимает параметр?Как обеспечить, чтобы класс, реализующий интерфейс или подкласс, расширяющий абстрактный класс, должен предоставлять конструктор по умолчанию?
1
A
ответ
1
Вы не можете сделать это на Java. Поскольку конструкторы не наследуются, нет способа заставить конструктор нулевого аргумента присутствовать, если в подклассе нет конструкторов. Если это так, то объект по умолчанию получит конструктор нуля arg. Вы можете использовать ключевое слово super
для вызова конструктора родителя
2
Вы не можете принудительно создавать сигнатуры конструктора в Java.
Лучше обнаружить проблему во время выполнения и выбросить/развернуть RuntimeException
. Например, это механизм сериализации.
Чтобы пойти немного дальше - если это возможно, падение опоры на .newInstance()
и сделать аннотацию @FactoryMethod
и использовать его на static
метод, который был бы фабричный метод:
public class Foo {
@FactoryMethod
public static Foo createFoo() {
return new Foo();; // or use another constructor, if there is no default?
}
...
}
Смежные вопросы
- 1. Подкласс, не расширяющий абстрактный класс
- 2. Интерфейс Java, расширяющий абстрактный класс?
- 3. Как создать общий класс java, расширяющий класс и реализующий интерфейс?
- 4. анонимный класс, расширяющий абстрактный класс
- 5. Интерфейс, расширяющий класс
- 6. Ошибка: Этот класс должен предоставлять конструктор по умолчанию (.....) [Instantiatable]
- 7. абстрактный класс или интерфейс
- 8. Java-класс, расширяющий абстрактный класс и реализующий интерфейс, имеющий те же методы
- 9. Создать анонимный класс, расширяющий внутренний абстрактный класс
- 10. Атрибут, интерфейс или абстрактный класс
- 11. Абстрактный класс, класс, интерфейс
- 12. Внесите класс, реализующий интерфейс, чтобы определить константу
- 13. Интерфейс или абстрактный класс для выполнения требований
- 14. Singleton класс, реализующий интерфейс
- 15. Анонимный класс, реализующий интерфейс
- 16. Как создать подкласс, реализующий интерфейс?
- 17. Абстрактный класс и конструктор
- 18. Предоставление TypeConverter через интерфейс или абстрактный класс
- 19. Java абстрактный класс конструктор
- 20. Почему мой подкласс рассматривается как абстрактный класс?
- 21. Абстрактный класс, реализующий интерфейс, не требует реализации метода. Зачем?
- 22. Класс должен быть объявлен как абстрактный или реализовать абстрактный метод
- 23. Общий или абстрактный класс?
- 24. Интерфейс, абстрактный класс или другой подход java
- 25. Подкласс абстрактный параметризованный класс с byte-buddy
- 26. Класс данных Kotlin, реализующий Java-интерфейс
- 27. Интерфейс, абстрактный класс и реализация
- 28. C# - Что я должен использовать, интерфейс, абстрактный класс или оба?
- 29. абстрактный класс с опубликованным Api, но конструктор доступа по умолчанию
- 30. Проигрыватель, расширяющий абстрактный класс, не получаемый