我有两个并行的类层次结构,我想将对象从一个转换为另一个。我可以通过手动指定要执行的转换来做到这一点,但是我需要两次指定转换:第一次是在实际转换发生时,第二次是我需要调用转换时。有没有办法只指定一次?
因此,这是一个可行的示例,但我想简化一下。有两个转换函数可让我在输入类(bI,cI)和输出类(bO,cO)之间进行选择。这是不可避免的。比较的实例虽然困扰我。是否有避免它们的优雅解决方案?
public class ConversionTest {
static public class aI {}
static public class bI extends aI {}
static public class cI extends aI {}
static public class aO {}
static public class bO extends aO {}
static public class cO extends aO {}
// Convert from bI to bO.
private static aO convert(bI iVar) {return new bO();}
// Convert from cI to cO.
private static aO convert(cI iVar) {return new cO();}
public static void main(String argv []) {
// Input variable.
final aI iVar = new bI();
// Output variable.
final aO temp;
// Perform conversion.
if(iVar instanceof bI) {
temp = convert((bI)iVar);
} else if (iVar instanceof cI) {
temp = convert((cI)iVar);
}
}
}
我想做这样的事情:
final a0 temp = convert(iVar.getClass().cast(iVar));
但是在这种情况下,编译器会抱怨找不到合适的转换函数。也许我可以指定所有可能转换的数组来尝试?
final a0 temp = convertHelp({bI,cI}, iVar);
我不确定应该如何实现此
convertHelp
函数。它将遍历数组并尝试找到适当的转换。有什么建议?谢谢。
最佳答案
鉴于您无法修改输入/输出类,最干净的解决方案可能是使用反射:
class Converter {
public ao convert(ai iObj) {
final Method m = getClass().getDeclaredMethod("cvrt", iObj.getClass());
return (ao)m.invoke(this, iObj);
}
public ao cvrt(ai iObj) {
return new ao();
}
public bo cvrt(bi iObj) {
return new bo();
}
public co cvrt(ci iObj) {
return new co();
}
}