我需要实现newInstance方法才能使这段代码正常工作:
protected IDatabase createDatabase() throws Exception{
return newInstance(CLASS_NAME_DATABASE);
}
protected IDataLoader createDataLoader() throws Exception{
return newInstance(CLASS_NAME_DATA_LOADER);
}
我不允许触摸此代码,但是当我尝试将newInstance实现为Object时,这意味着我需要在您上方的代码中强制转换newInstance。有没有办法在不更改代码的情况下实现newInstance?
谢谢!
答案 0 :(得分: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
然后将其取消装箱)。
但是,在编译时也不会检查手动转换Object
返回值,因此在这里使用泛型可能仍然是一种改进,因为它减少了必须编写每种类型的次数。