我需要实现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/

10-11 10:38