gpt4 book ai didi

java - 如何在运行时获取对象类型?

转载 作者:行者123 更新时间:2023-12-01 13:20:25 31 4
gpt4 key购买 nike

我正在尝试创建一个类,负责管理应用程序的所有数据库访问,控制具有所有 protected 方法的 DAO 对象的 API。由于我是巴西人,一些标识符是葡萄牙语的,无论如何我认为你能够理解那里发生的事情..以下是代码:

public class DatabaseManager {

private ItemExpansivelDataSource itemExpansivelDataSource;
private ConfiguracoesDashboardDataSource configuracoesDashboardDataSource;
private PranchaDataSource pranchaDataSource;
private PranchaRaizDataSource pranchaRaizDataSource;

private HashMap<Class<?>, DataSource<?>> dataSourcesMap;

public DatabaseManager() {
super();
this.dataSourcesMap = new HashMap<Class<?>, DataSource<?>>();
dataSourcesMap.put(ItemExpansivel.class, itemExpansivelDataSource);
dataSourcesMap.put(ConfiguracoesDashboard.class, itemExpansivelDataSource);
dataSourcesMap.put(Prancha.class, itemExpansivelDataSource);
dataSourcesMap.put(PranchaRaiz.class, itemExpansivelDataSource);
}

public void insert(Object objeto){
if(dataSourcesMap.containsKey(objeto.getClass())) {
return dataSourcesMap.get(objeto.getClass()).insert(objeto);
} else {
throw new RuntimeException(ErrorMessages.NAO_EXISTE_DATA_SOURCE.toString());
}
}

这是我的数据源的声明

public interface DataSource<T> {

List<T> getAll();
T findById(Integer id);

void openConection();
void closeConection();

void update(T valor);
void update(List<T> valores);

T insert(T valor);
List<T> insert(List<T> valores);

void delete(T valor);
void delete(List<T> valores);

Integer getLastInsertedRowId();
T converter(Cursor cursor);
}

我的问题是java不知道它将接收什么样的对象作为参数,所以我无法像我尝试做的那样调用插入方法,我需要找到解决方法,但我什么也不能想。我希望有人可以给我带来一些启发,因为我真的认为这是控制我的 DAO 对象的 API 的好方法。非常感谢

最佳答案

使其类型安全的唯一方法是向您的 DataSource interface 添加一个方法,该方法返回所需的类型,即:

Class<T> getDataType();

然后,您可以通过为每个操作引入一个辅助方法,将 Map 操作转换为类型安全的代码:

public Object insert(Object objeto){
final DataSource<?> dataSource = dataSourcesMap.get(objeto.getClass());
if(dataSource!=null) {
assert dataSource.getDataType().isInstance(objeto);
return doInsert(dataSource, objeto);
} else {
throw new RuntimeException(ErrorMessages.NAO_EXISTE_DATA_SOURCE.toString());
}
}
private static <T> T doInsert(DataSource<T> ds, Object o) {
return ds.insert(ds.getDataType().cast(o));
}

没有这种方法的唯一方法是在没有类型安全的情况下工作。如果您的 Map 是私有(private)的,并且您正确维护映射,以便始终拥有有效的 Class-key → value 的类型参数关系,这可能是一个选项。在这种情况下,请使用上面的帮助器方法,但将 ds.getDataType().cast(o) 替换为不安全的类型转换:(T)o.

关于java - 如何在运行时获取对象类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22063667/

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