2015-10-03 3 views
3

мне нужно реализовать метод newInstance для того, чтобы сделать этот код для работы:различный тип возврата для того же метода

protected IDatabase createDatabase() throws Exception{ 
    return newInstance(CLASS_NAME_DATABASE); 
} 

protected IDataLoader createDataLoader() throws Exception{ 
    return newInstance(CLASS_NAME_DATA_LOADER); 
} 

Я не разрешается трогать этот код, но когда я пытаюсь реализовать newInstance as Object, это означает, что мне нужно добавить newInstance в код выше вас. Есть ли способ для меня реализовать newInstance без изменения кода?

Спасибо!

+0

использование метода перегрузки и литье под давлением –

+0

Что такое 'CLASS_NAME_DATABASE' и' CLASS_NAME_DATA_LOADER'? Если они разные типы, вы можете перегружать, как говорит Никос, и если они являются объектами класса, есть трюк, который вы можете сделать с помощью общих методов. Edit: Кроме того, является ли 'IDatabase' субинтерфейсом' IDataLoader'? – hugh

+0

Я отправил ответ, но быстро понял, что, возможно, допустил ошибку, предполагая, что вы можете перегружать методы, изменяя типы возвращаемых данных; Я снова удалил его. – user2651804

ответ

1

Если параметр 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, а затем удаляет его).

Однако при компиляции также не будет проверяться возвращаемое значение ObjectObject, поэтому использование дженериков здесь, вероятно, по-прежнему является улучшением, поскольку оно уменьшает количество раз, когда вам приходится писать каждый тип.

+0

Можно отметить, что 'klass.newInstance()' является фактическим именем метода 'Class'. Не метод OP пытается определить. – user2651804

+0

@ user2651804 Уточненный. – Boann

Смежные вопросы