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));
}