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
}
}
我需要 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
}
}