我有一个超类和一些扩展超类的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;
}
}
有替代方案吗?
答案 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);
}