Если параметр newInstance
был Class
объект, или что-то еще с параметром универсального типа, вы можете сделать следующее, что позволит избежать необходимости, возвращаемое значение, и быть типобезопасный:
protected <T> T newInstance(Class<T> klass) throws Exception {
return klass.newInstance();
}
(Примечание: klass.newInstance()
является метод отражения API, не такой же, как метод определяется, несмотря на то же имя.)
Однако, вы не можете использовать дженерики, независимо от того, какие параметры newInstance
принимает:
@SuppressWarnings("unchecked")
protected <T> T newInstance(String className) throws Exception {
return (T)Class.forName(className).newInstance();
}
Это немного грязно, потому что оно полностью исключает проверку ошибок времени компиляции по типу возвращаемого значения. Компилятор позволит IDataLoader x = newInstance(CLASS_NAME_DATA_LOADER);
, но так же счастливо разрешит int x = newInstance(CLASS_NAME_DATA_LOADER);
(который фактически отбрасывает его на Integer
, а затем удаляет его).
Однако при компиляции также не будет проверяться возвращаемое значение Object
Object
, поэтому использование дженериков здесь, вероятно, по-прежнему является улучшением, поскольку оно уменьшает количество раз, когда вам приходится писать каждый тип.
использование метода перегрузки и литье под давлением –
Что такое 'CLASS_NAME_DATABASE' и' CLASS_NAME_DATA_LOADER'? Если они разные типы, вы можете перегружать, как говорит Никос, и если они являются объектами класса, есть трюк, который вы можете сделать с помощью общих методов. Edit: Кроме того, является ли 'IDatabase' субинтерфейсом' IDataLoader'? – hugh
Я отправил ответ, но быстро понял, что, возможно, допустил ошибку, предполагая, что вы можете перегружать методы, изменяя типы возвращаемых данных; Я снова удалил его. – user2651804