有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

同一方法的不同返回类型

我需要实现newInstance方法以使此代码正常工作:

protected IDatabase createDatabase() throws Exception{
    return newInstance(CLASS_NAME_DATABASE);
}

protected IDataLoader createDataLoader() throws Exception{
    return newInstance(CLASS_NAME_DATA_LOADER);
}

我不允许接触这段代码,但当我尝试将newInstance作为对象实现时,这意味着我需要在您上面的代码中强制转换newInstance。有没有一种方法可以让我在不更改代码的情况下实现newInstance

谢谢


共 (1) 个答案

  1. # 1 楼答案

    如果newInstance的参数是一个Class对象,或者其他带有泛型类型参数的对象,则可以执行以下操作,这将避免强制转换返回值,并且是类型安全的:

    protected <T> T newInstance(Class<T> klass) throws Exception {
        return 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返回值,因此在这里使用泛型可能仍然是一种改进,因为它减少了必须编写每个类型的次数