У меня есть параметризованный интерфейс RestHandler.Java Generic For Parameterized Class: Unbounded Wildcards vs Raw Type
public interface RestHandler<T> {
blah blah blah...
}
И мне нужно создать класс из config, используя Class.forName. Теперь я придумал три версии, которые ВСЕ компилируются успешно.
Версия 1:
@SuppressWarnings("unchecked")
public static <T> RestHandler<T> create(final String handlerImplFqcn) throws ClassNotFoundException,
IllegalAccessException,
InstantiationException {
Class<?> handlerClass = Class.forName(handlerImplFqcn);
return (RestHandler<T>) handlerClass.newInstance();
}
Версия 2:
public static RestHandler<?> create(final String handlerImplFqcn) throws ClassNotFoundException,
IllegalAccessException,
InstantiationException {
@SuppressWarnings("rawtypes")
Class handlerClass = Class.forName(handlerImplFqcn);
return (RestHandler<?>) handlerClass.newInstance();
}
Версия 3:
public static RestHandler<?> create(final String handlerImplFqcn) throws ClassNotFoundException,
IllegalAccessException,
InstantiationException {
Class<?> handlerClass = Class.forName(handlerImplFqcn);
return (RestHandler<?>) handlerClass.newInstance();
}
Мой вопрос, почему все они работают, и которые можно было бы лучше практике?
Мое личное предпочтение для первого примера, хотя вы не должны нуждаться в SuppressWarnings аннотации. Хотя вы должны отметить, что во всех этих примерах можно также исключить ClassCastException. – Dave