Как обеспечить, чтобы класс, реализующий интерфейс, или подкласс, расширяющий абстрактный класс, должен предоставлять конструктор по умолчанию? - PullRequest
1 голос
/ 02 октября 2010

Я указал интерфейс (хотя я могу изменить его на абстрактный класс, если это поможет), скажем, T.Пользователи моего API передадут мне Class<? extends T>, на который я позвоню newInstance() (я не могу изменить эту часть).Как я могу гарантировать, что классы, которые расширяют T, имеют конструктор, который не принимает параметров?

Ответы [ 2 ]

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

Вы не можете форсировать какие-либо сигнатуры конструктора в 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 голос
/ 02 октября 2010

Вы не можете сделать это в Java. Поскольку конструкторы не наследуются, невозможно заставить конструктор с нулевым аргументом присутствовать, если в подклассе нет конструкторов. Если это так, то объект получит конструктор с нулевым аргументом по умолчанию. Вы можете использовать ключевое слово super, чтобы вызвать конструктор родителя

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