2010-10-02 5 views
1

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

ответ

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? 
    } 
    ... 
} 
Смежные вопросы