例如。我有一百或更多的類A,B,C ...,不能改變。並從外部來源接收它們。每個這些類都有子類{A1,A2,... An},{B1},{C1,C2} ...我應該根據它的超類創建。 但大多數超級計算機都只有一個子將演員分爲子演員
我只能看到兩個變種:
創建百種工廠方法(或constractor)爲每類層次結構得到的子類。 喜歡的東西:
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;
我現在它不會工作,但我想以這種方式的東西;
這ISN」清除。什麼是'isA1','isA2'等?你究竟想在這裏做什麼? (即爲什麼你需要以通用的方式動態創建這些數百個子類的實例?) –
某些抽象布爾函數決定應創建哪個子類對象。實際上在這種情況下並不重要。 – Rufim
方式可能不是通用的。我只是搜索方式,以避免許多設置(get())語句 – Rufim