问题描述
例如。 我有100个或更多无法更改的类A,B,C...。 并从外部来源接收它们。 这些类中的每一个都有子类{A1,A2,... An},{B1},{C1,C2} ...我应该根据其超类创建。 但是大多数超级只有一个子
我只能看到两个变体:
我为每个类层次结构创建了一百个工厂方法(或承包商)来获取子类。 就像是:
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;
我现在不起作用,但是我想要这种方式。
1楼
要将变量转换为子类,则必须将该变量实例化为该子类(或该子类的子类)。
ClassA a = new SubA();
SubA sub = (SubA) a;
要么
ClassA a = new SubSubA();
SubA sub = (SubA) a;
哪里
ClassA {...}
SubA extends ClassA{...}
SubSubA extends SubA{...}
要检查您使用的对象是否可以强制转换为给定的类:
if (a instanceof SubA) {
//safe cast
SubA sub = (SubA) a;
}