Java Generics - класс или класс <? extends SomeClass>
Я пишу программу, которая будет использовать отражение Java (т.е. Class.forName()
) для динамического создания экземпляра класса на основе ввода пользователем. Одним из требований является то, что экземпляр, созданный моей программой, должен расширять один определенный класс I, называемый SomeClass
. Мой вопрос: для хранения этого типа класса я должен использовать ограниченный общий, Class<? extends SomeClass>
или просто неограниченный общий, Class
? Я обнаружил, что некоторые Java-книги говорят, что Class является одной из хороших практик использования неограниченного шаблона подстановочных знаков, но мне интересно, относится ли это к ситуации в моей программе.
Пожалуйста, не стесняйтесь, дайте мне знать, если вы нашли мой вопрос, недостаточно ясный или нужна некоторая информация.
Ответы
Ответ 1
Вы должны использовать Class<? extends SomeClass>
, потому что для этого необходимы дженерики.
В то время, когда вы вызываете Class.forName
, проверьте, не стал ли он SomeClass.class.isAssignableFrom
новым классом. В противном случае вы должны выбросить IllegalArgumentException
или ClassCastException
.
РЕДАКТИРОВАТЬ: Альтернативно, вызов asSubclass(SomeClass.class)
сделает это для вас.
Например:
public SomeClass instantiate(String name)
throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class<?> raw = Class.forName(name);
//throws ClassCastException if wrong
Class<? extends SomeClass> generic = raw.asSubclass(SomeClass.class);
// do what you want with `generic`
return generic.newInstance();
}