gpt4 book ai didi

Java 泛型 - 接受不同泛型接口(interface)的方法

转载 作者:行者123 更新时间:2023-12-02 18:31:53 24 4
gpt4 key购买 nike

假设我有这个代码:

IOperation<?> parameter1 = null;
ITotallyDifferentOperation<?> parameter2 = null;

switch (OPERATION_TYPE) {
case TYPE_1:
parameter1 = new MyOperation<Type1>();
parameter2 = new MyTotallyDifferentOperation<Type1>();
break;
case TYPE_2:
parameter1 = new MyOperation<Type2>();
parameter2 = new MyTotallyDifferentOperation<Type2>();
break;

...

switch (DB_OPERATION_TYPE) {
case DB_TYPE_1:
myMethod(parameter1, parameter2);
break;
case DB_TYPE_2:
myOtherMethod(parameter1, parameter2);
break;

...

接受两个interfaces的方法由 MyOperation 实现和MyTotallyDifferentOperation :

void myMethod(final IOperation<?> operation, final ITotallyDifferentOperation<?> totallyDifferentOperation) {
operation.processList(totallyDifferentOperation.getList());
}

totallyDifferentOperation.getList()返回 List<T>这与 List<T> 的类型相同接受operation.processList() .

这段代码显然无法编译。
是否有其他模式可以获得相同的结果或者可以更正此代码?

根据要求,我发布了更多该方法的内容。不幸的是,我无法透露更多信息,这是一个模型。
我需要这种模式来避免重复代码。

最佳答案

没有既定的设计模式可以为您提供帮助。

<小时/>

您的问题出在这些变量的声明中:

IOperation<?> parameter1 = null;
ITotallyDifferentOperation<?> parameter2 = null;

通过使用通配符,您可以有效地告诉编译器“我不关心类型”。这不是真的。最终你确实关心类型。

从根本上说,您的方法试图做太多事情,这就是导致您出现问题的原因。将其分解为多种方法,它会变得更加容易:

switch (OPERATION_TYPE) {
case TYPE_1:
typeOne();
case TYPE_2:
typeTwo();
}

private void typeOne()
{
IOperation<Type1> parameter1 = new MyOperation<>();
ITotallyDifferentOperation<Type1> parameter2 = new MyTotallyDifferentOperation<>();

doTheChecks(parameter1, parameter2);
databaseStuff(parameter1, parameter2);
}

private void typeTwo() /*identical to above, except the types*/
{
IOperation<Type2> parameter1 = new MyOperation<>();
ITotallyDifferentOperation<Type2> parameter2 = new MyTotallyDifferentOperation<>();

doTheChecks(parameter1, parameter2);
databaseStuff(parameter1, parameter2);
}

<T> void doTheChecks(IOperation<T> param1, ITotallyDifferentOperation<T> param2)
{
...
}

<T> void databaseStuff(IOperation<T> param1, ITotallyDifferentOperation<T> param2)
{
switch (DB_OPERATION_TYPE) {
case DB_TYPE_1:
myMethod(param1, param2);
break;
case DB_TYPE_2:
myOtherMethod(param1, param2);
break;
}
}

关于Java 泛型 - 接受不同泛型接口(interface)的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47634527/

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