我需要实现 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
对象,或者其他带有通用类型参数的对象,您可以执行以下操作,这将避免强制转换 return值,并且是类型安全的:
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);
(实际上将其转换为 整数
然后拆箱)。
但是,手动转换 Object
返回值也不会在编译时检查,因此在这里使用泛型可能仍然是一种改进,因为它减少了您必须编写每种类型的次数。
关于java - 同一个方法的不同返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32924657/