Java:使用泛型和映射而不强制转换/@SuppressWarnings
我现在多次遇到这个问题,总是通过一些强制转换和Java:使用泛型和映射而不强制转换/@SuppressWarnings,java,generics,casting,pecs,Java,Generics,Casting,Pecs,我现在多次遇到这个问题,总是通过一些强制转换和@SuppressWarnings注释来解决这个问题 相关接口/抽象类: 有没有办法在不取消选中强制转换的情况下执行此操作?您可以委托给捕获类型的私有方法,以便使用它可靠地强制转换到正确的数据子类: Map<Class<?>, DataOperationsFactory<?>> map; // Unchanged public Test(List<DataOperationsFactory<?>
@SuppressWarnings
注释来解决这个问题
相关接口/抽象类:
有没有办法在不取消选中强制转换的情况下执行此操作?您可以委托给捕获类型的私有方法,以便使用它可靠地强制转换到正确的数据子类:
Map<Class<?>, DataOperationsFactory<?>> map;
// Unchanged
public Test(List<DataOperationsFactory<?>> fs) {
for(DataOperationsFactory<?> f : fs) {
map.put(f.getDataClass(), f);
}
}
public DataOperations getOps(Data data) {
DataOperationsFactory<?> f = map.get(data.getClass());
return getOperations(f, data);
}
private static <T extends Data> DataOperations getOperations(DataOperationsFactory<T> f,
Data data) {
return f.getOperations(f.getDataClass().cast(data));
}
Map>Map;
//不变的
公共测试(列表f:fs){
put(f.getDataClass(),f);
}
}
公共数据操作getOps(数据){
DataOperationsFactory f=map.get(data.getClass());
返回getOperations(f,数据);
}
私有静态DataOperations getOperations(DataOperationsFactoryF,
(数据){
返回f.getOperations(f.getDataClass().cast(数据));
}
您可以委托给捕获类型的私有方法,这样就可以使用它可靠地强制转换到正确的数据子类:
Map<Class<?>, DataOperationsFactory<?>> map;
// Unchanged
public Test(List<DataOperationsFactory<?>> fs) {
for(DataOperationsFactory<?> f : fs) {
map.put(f.getDataClass(), f);
}
}
public DataOperations getOps(Data data) {
DataOperationsFactory<?> f = map.get(data.getClass());
return getOperations(f, data);
}
private static <T extends Data> DataOperations getOperations(DataOperationsFactory<T> f,
Data data) {
return f.getOperations(f.getDataClass().cast(data));
}
Map>Map;
//不变的
公共测试(列表f:fs){
put(f.getDataClass(),f);
}
}
公共数据操作getOps(数据){
DataOperationsFactory f=map.get(data.getClass());
返回getOperations(f,数据);
}
私有静态DataOperations getOperations(DataOperationsFactoryF,
(数据){
返回f.getOperations(f.getDataClass().cast(数据));
}
是否数据操作
不应针对数据类型进行参数化
?它不必进行参数化,可以硬连线。我将在几分钟后添加一些示例实现。在不同的单词中,类成员中的通配符存在相同的问题。困扰我的是,您显示的两个类型转换都无效,因为它们太宽(尽管它们最终会以任何方式工作,因为它们未被选中)。但这些是Eclipse不输出错误的唯一强制转换。数据操作
是否不应该为数据类型
参数化?它不必,可以硬连线。我将在几分钟后添加一些示例实现。在不同的单词中,类成员中的通配符存在相同的问题。困扰我的是,您显示的两个类型转换都无效,因为它们太宽(尽管它们最终会以任何方式工作,因为它们未被选中).但这些是Eclipse唯一不输出错误的强制转换。这很有效!非常感谢。仍然令人恼火的是,你必须编写额外的代码来愚弄编译器,使其在没有任何警告的情况下工作。这很有效!非常感谢。仍然令人恼火的是,您必须编写额外的代码,以愚弄编译器,使其在没有任何警告的情况下工作。
public class Test {
Map<Class<?>, DataOperationsFactory<?>> map;
public Test(List<DataOperationsFactory<?>> fs) {
for(DataOperationsFactory<?> f : fs) {
map.put(f.getDataClass(), f);
}
}
@SuppressWarnings("unchecked")
public <T extends Data> DataOperations getOps(T data) {
// --> Here I need to do an unchecked cast <--
DataOperationsFactory<? super T> f =
(DataOperationsFactory<? super T>) map.get(data.getClass());
return f.getOperations(data);
}
}
Map<Class<?>, DataOperationsFactory<?>> map;
// Unchanged
public Test(List<DataOperationsFactory<?>> fs) {
for(DataOperationsFactory<?> f : fs) {
map.put(f.getDataClass(), f);
}
}
public DataOperations getOps(Data data) {
DataOperationsFactory<?> f = map.get(data.getClass());
return getOperations(f, data);
}
private static <T extends Data> DataOperations getOperations(DataOperationsFactory<T> f,
Data data) {
return f.getOperations(f.getDataClass().cast(data));
}