我需要实现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?
谢谢!
最佳答案
如果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
返回值,因此在这里使用泛型可能仍然是一项改进,因为它减少了您必须编写每种类型的次数。关于java - 相同方法的不同返回类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32924657/