java - 同一个方法的不同返回类型

标签 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?

谢谢!

最佳答案

如果 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/

相关文章:

flash - 访问 AS3 中的 Document 类

java - 从 JDK 1.7 开始,从 catch block 中抛出异常对象不需要 throws 子句!!!为什么会这样?

java - 为什么 Hashmap 上的浅复制没有反射(reflect)

java - Lettuce Redis库强一致性使用ReadFrom

java - 为什么在 Java 中打印数组内存位置?

java - 我正在使用 MVC 和三层架构设计一个 Web 应用程序。我遇到了三层架构的设计问题

Java:只使用静态方法和字段可以称为过程范式吗?

c++ - 有哪些技巧可以使具有大量计算的函数变得干净?

c# - 当多个方法重载匹配时,优先级是什么?

php - 在 PHP 中创建对象数组