gpt4 book ai didi

带有抽象参数的Java泛型接口(interface)调用

转载 作者:行者123 更新时间:2023-11-30 10:11:46 27 4
gpt4 key购买 nike

我知道有很多类似的问题,但如果可能的话,我没有运气找到一个好的和干净的解决方案。我正在实现一个带有抽象类型子类的通用接口(interface)。问题是,当我调用它们时,我要么必须在 switch/case 中进行类型转换,要么在接口(interface)实现中的每个方法中进行类型转换,我想不出一个好的和干净的方法......我最好只写下面是一个简短的例子。

// An abstract type with 2 implementations...
public abstract class ObjTypeAbstract {}

public class ObjType extends ObjTypeAbstract {}
public class ScriptType extends ObjTypeAbstract {}

现在两种类型的处理器都有一个接口(interface)

interface ProcessorInterface<T extends ObjTypeAbstract> {
public void abcMethod(T obj);
}

public class ObjProcessor implements ProcessorInterface<ObjType> {
public void abcMethod(ObjType obj) {}
}
public class ScriptProcessor implements ProcessorInterface<ScriptType> {
public void abcMethod(ScriptType obj) {}
}

我正在苦苦挣扎的是一种基于 ObjAbstractType 调用这些处理器的方法。我有一个类作为中间件服务器??或者我应该怎么调用它。:

想法是通过单个开关/外壳简单地获得正确的处理器:

public class Processor {
private ProcessorInterface objProcessor = new ObjProcessor();
private ProcessorInterface scriptProcessor = new ScriptProcessor();

public methodAbc(ObjAbstractType obj) {
getProcessor(obj).abcMethod(obj);
}

private ProcessorInterface getProcessor(ObjAbstractType obj) {
if (obj instanceof ObjType) {
return objectProcessor;
} else if (obj instanceof ScriptType) {
return scriptProcessor;
}

return nullProcessor;
}
}

这就是我想要的,它还负责将 objAbstract 类型转换为 abcMethod 的实际类型,问题是它会导致不会破坏代码的 RawType 警告,但我想摆脱它。

这就是我卡住的地方......因为如果我将处理器转换为特定类型,如下所示:

private ProcessorInterface<ObjType> objProcessor = new ObjProcessor();
private ProcessorInterface<ScriptType> scriptProcessor = new ScriptProcessor();

我将无法从 getProcessor 方法返回一个抽象的,所以我必须使用 ObjAbstractType 及其所有方法来实现这些接口(interface),并在每个处理器的所有方法中进行类型转换,例如:

public class ScriptProcessor implements ProcessorInterface<ObjAbstractType> {
public void abcMethod(ObjAbstractType obj) {
ScriptType scr = (ScriptType) obj;
}
}

另一个解决方案可能是在 Processor 中间件类中有一个 switch/case 并在其中转换 ObjAbstractType,但我必须在 abcMethod 和所有其他方法中编写该开关,或者从 getProcessor 方法返回 Processor 和转换的 ObjType。 . 所以我必须返回一些包含两者的 dto。 :/

您是否有任何想法/模式可以帮助我摆脱 RawType 调用警告而无需使用更多 switch/case 或类型转换扩展代码?大卫,祝你有美好的一天,我很乐意进行任何讨论。

最佳答案

您需要一种方法来存储 ObjTypeAbstract 之间的映射类和一个ProcessorInterface实例。
你可以使用 Map关联ObjTypeAbstract s(作为键)到 ProcessorInterface s(作为值)。
关于原始类型问题,您可以使用 ProcessorInterface<? extends ObjTypeAbstract>对于声明的变量,但您仍然需要对 ProcessorInterface<ObjTypeAbstract> 执行不安全的转换能够调用ProcessorInterface.abcMethod()作为参数 a ObjTypeAbstract声明的类型。
这种转换对于您的实际设计是不可避免的。

它可以给出类似的东西:

public class Processor {

private Map<Class<? extends ObjTypeAbstract>, ProcessorInterface<? extends ObjTypeAbstract >> map = new HashMap<>();

public Processor(){
map.put(ObjType.class, new ObjProcessor());
map.put(ScriptType.class, new ScriptProcessor());
}
public void methodAbc(ObjTypeAbstract obj) {
@SuppressWarnings("unchecked")
ProcessorInterface<ObjTypeAbstract> processorInterface = (ProcessorInterface<ObjTypeAbstract>) map.get(obj.getClass());
processorInterface.abcMethod(obj);
}

}

关于带有抽象参数的Java泛型接口(interface)调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52243201/

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