gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:57:25 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com