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();
}