gpt4 book ai didi

Java:在不进行强制转换的情况下使用泛型和映射/@SuppressWarnings

转载 作者:行者123 更新时间:2023-12-01 21:26:56 25 4
gpt4 key购买 nike

我现在多次遇到这个问题,并且总是通过一些强制转换和 @SuppressWarnings 来解决这个问题。注释。

相关接口(interface)/抽象类:

public abstract class Data { }

public interface DataOperations {
boolean isValid();
}

public interface DataOperationsFactory<T extends Data> {
Class<T> getDataClass();
DataOperations getOperations(T data);
}

示例实现:

public class DataImpl1 extends Data {
public String foo;
}

public class DataImpl1Operations implements DataOperations {
private DataImpl1 data;
public DataImpl1Operations(DataImpl1 data) {
this.data = data;
}
public boolean isValid() {
return data.foo != null;
}
}

public class DataImpl1OperationsFactory extends DataOperationsFactory<DataImpl1> {
public Class<DataImpl1> getDataClass() {
return DataImpl1.class;
}
DataOperations getOperations(DataImpl1 data) {
return new DataImpl1Operations(data);
}
}

使用此模式,我可以决定是否需要创建 new DataImpl1Operations每次。或者也许使用 final static NO_OP实现或者你有什么。

代码:

现在我想将所有这些工厂放入 Map<Class<T>, DataOperationsFactory<T>> 中(构造函数)。然后从中读取(getOps方法)。

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);
}
}
<小时/>

有没有办法在不进行未经检查的转换的情况下做到这一点?

最佳答案

您可以委托(delegate)一个捕获类型的私有(private)方法,因此它可以用于可靠地转换为正确的 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));
}

关于Java:在不进行强制转换的情况下使用泛型和映射/@SuppressWarnings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38018624/

25 4 0
文章推荐: Java - Set removeAll(Set) 不执行其工作