繁体   English   中英

相同方法的不同返回类型

[英]Different return type for the same method

我需要实现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返回值,因此在此处使用泛型可能仍然是一种改进,因为它减少了您必须编写每种类型的次数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM