相同方法的不同返回类型

时间:2015-10-03 16:09:36

标签: java oop

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

谢谢!

1 个答案:

答案 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返回值,因此在这里使用泛型可能仍然是一种改进,因为它减少了必须编写每种类型的次数。