2015-07-19 504 views
0

例如。我有一百或更多的類A,B,C ...,不能改變。並從外部來源接收它們。每個這些類都有子類{A1,A2,... An},{B1},{C1,C2} ...我應該根據它的超類創建。 但大多數超級計算機都只有一個將演員分爲子演員

我只能看到兩個變種:

  1. 創建百​​種工廠方法(或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; 
    } 
    
  2. 我可以使用反射

    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

這ISN」清除。什麼是'isA1','isA2'等?你究竟想在這裏做什麼? (即爲什麼你需要以通用的方式動態創建這些數百個子類的實例?) –

+0

某些抽象布爾函數決定應創建哪個子類對象。實際上在這種情況下並不重要。 – Rufim

+0

方式可能不是通用的。我只是搜索方式,以避免許多設置(get())語句 – Rufim

回答

0

要將變量轉換爲子類,必須將該變量作爲該子類(或該子類的子類)進行實例化。

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; 
} 
+0

感謝您的回答。我不是自己創造它們的;問題已更新。 – Rufim