我有两个并行的类层次结构,我想将对象从一个转换为另一个。我可以通过手动指定要执行的转换来做到这一点,但是我需要两次指定转换:第一次是在实际转换发生时,第二次是我需要调用转换时。有没有办法只指定一次?

因此,这是一个可行的示例,但我想简化一下。有两个转换函数可让我在输入类(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();
   }
}

09-04 06:04
查看更多