例如。我有一百个或更多的课程 A,B,C ... 无法更改。并从外部来源接收它们。这些类中的每一个都有子类 {A1,A2,... An},{B1},{C1,C2} ......我应该根据它的超类来创建它们。 但大多数超级只有一个 sub
我只能看到两种变体:
我为每个类层次结构创建了一百个工厂方法(或约束器)来获取子类。 类似的东西:
public static <Sub extends A> Sub buildSubClass(A superc) {
Sub subclass;
if(isA1(superc)) {
subclass = new A1();
subclass.setField(superc.getField())
// etc for each field of A class
} else if(isA2(superc)) {
subclass = new A2();
subclass.setField(superc.getField())
// ....
} // etc.
return subclass;
}
我可以使用反射
public static <S, T> T castObject(S source, Class<T> targetClass) {
T newInstance = targetClass.newInstance();
for (Field field : source.getClass().getDeclaredFields()) {
for (Field fieldTarget : targetClass.getDeclaredFields()) {
if (isFieldsEqual(field, fieldTarget)) {
setField(getField(field, source),
fieldTarget, newInstance);
}
}
}
return newInstance;
}
有java更优雅的方式将对象转换为子类对象吗?对我来说理想的方法就是改变对象签名,不要创建A子类的新实例,而是改变它,以便java将其视为子类对象的实例(带有新字段)。 类似的东西:
A superc = new A();
A1 sub = (A1) superc;
我现在不行,但我想要这样的东西;
答案 0 :(得分:0)
要将变量强制转换为子类,必须将变量实例化为该子类(或该子类的子类)。
use function A\test;
use const B\test;
或
ClassA a = new SubA();
SubA sub = (SubA) a;
,其中
ClassA a = new SubSubA();
SubA sub = (SubA) a;
检查您正在使用的对象是否可以转换为给定的类:
ClassA {...}
SubA extends ClassA{...}
SubSubA extends SubA{...}