Java,根据实例使用正确的构造函数

Java, use correct constructor based on instance

我需要 Class C 根据实例变量选择正确的构造函数。我有下面显示的基本代码。每当我创建 class B 的实例并将其存储为对 A 的引用时。'Wrong' 构造函数用于 class C。如果我不想更改它,我有什么选择使用 (b instanceOf B) 因为它在其他包中。

Class A {
}

Class B extends A {
}


Class C {
    C(A a){...}
    C(B b){...}
}

Class Main{
    private createClass(String s){
        if (...){
            return new B();
        }
    }

    public static void main(String[] args){
        A b = createClass("s");
        new C(b); //--> constructor C(A a) is used but i need C(B b)
    }
}

new C(A a) 被调用,因为 b 变量在编译时是 A 类型。编译器不知道在运行时它将保存对 B 实例的引用,这就是它绑定到 new C(A a) 构造函数的原因。

总的来说,我认为你应该重新考虑你的设计,但如果你想保持这样,你至少可以使 createClass() 方法通用并传递结果的 Class<T>类型:

private <T extends A> T createClass(String s, Class<T> clazz){
    if (...) {
        return clazz.newInstance();
    }
    //
}

这将允许您指出(并轻松切换)您需要的结果类型:

B b = createClass("s", B.class);
new C(b);

与其使用两个构造函数,不如使用单个构造函数并使用 if ( a instanceOf B) 并强制转换 B 中的对象,以专门执行与 class B 相关的所有操作。就像下面的片段

Class C {
    C(A a){
        if(a instanceOf B){
            B b =(B) a;
            // all the stuff related to B only
        }
        //common work for both the scenarios
    }
}