Java运行时子类型构造函数调用

时间:2014-05-13 20:34:14

标签: java constructor casting runtime

我有一个超类和一些扩展超类的Sub类。每个子类都有一些构造函数方法,它们接受任何Sub类型的类型。

abstract class Super {}
    final class Sub1 extends Super {
        public Sub1(Sub1 arg) {}
        //...
        public Sub1(Sub4 arg) {}
    }
    //...
    final class SubN extends Super {
        public SubN(Sub3 arg) {}
        //...
        public SubN(SubN arg) {}
    }
}

现在我想在Super类中创建一个方法,从一个Sub类型转换为另一个。我们说

public Super cast(Super arg) {
    if (arg instanceof Sub1)  {
        return new Sub1(this);
    } else if (arg instanceof Sub2) {
        return new Sub2(this);
    }//...
    return null;
}

对所有子类重复这种模式是愚蠢的。我发现的解决方案就是这个(使用反射),但速度太慢。

public Super cast(Super arg) {
    try {
        Class<? extends Super> type = arg.getClass();
        return type.getConstructor(this.getClass()).newInstance(this);
    } catch (Exception e) {
        return null;
    }
}

有替代方案吗?

1 个答案:

答案 0 :(得分:0)

为什么不反过来呢?而不是super.cast(sub)sub.copy(super)示例:

class Sub1 extends Super {
    public Super copy(Super input) {
        return new Sub1(input);
    }
}

class Sub2 extends Super {
    public Super copy(Super input) {
        return new Sub2(input);
    }
}

以几乎相同的方式调用它,并阻止使用任何 if语句,并获得完全相同的功能。

如果您的旧代码是:

void doSomething(Super super, Super iAmActuallyASub) {
    Super superDuper = super.cast(iAmActuallyASub);
}

新代码将是

void doSomething(Super super, Super iAmActuallyASub) {
    Super superDuper = iAmActuallyASub.copy(super);
}