2012-03-29 117 views
0

我是Java新手。 我正在開發類似於iOS應用的Android程序。 應用程序的目的之一 - 是從服務器獲取數據。 數據往往是陣列字典等 「ID = 1」, 「名稱= SomeName」。 我有類從泛型創建類或超類的實例

class BaseArrayList<Type extends BaseItem> extends BaseItem { 

public void processObject(Map<?,?> map) { 
    //...... 
    //Some loop body 
    Type item = (Type) Type.create(); 
    item.processObject(map); 
    //..... 
} 

而且BaseItem有方法來創建():

public static BaseItem create() { 
    return new BaseItem(); 
} 

它的工作原理,但BaseItem的sublass - 它不能正常工作。 我發現靜態方法不重寫。

那麼,如何才能解決這個任務:創建數組的自定義類,只需創建如BaseArrayList的定製實例:

new BaseArrayList<SomeSublassOfBaseItem> 

這個問題在ObjC解決這樣的 -

[[memberClass alloc] init]; 
+0

Type item = Type.newInstance(); – 2012-03-29 13:37:43

+0

看看「爲什麼Java不允許重寫靜態方法?」 http://stackoverflow.com/q/2223386/1250303 – Java42 2012-03-29 13:38:09

+0

@AlexeiKaigorodov這不適用於任意類型。 – Jesper 2012-03-29 13:53:54

回答

1

我發現靜態方法不重寫。

事實上,壓倒一切的不靜態方法的工作。

有不同的方法來實現你想要做的事情。一個是一個Class<Type>對象傳遞給你的processObject方法,你可以用它來從通過調用它newInstance()創建Type實例:

public void processObject(Map<?, ?> map, Class<Type> cls) { 
    // Uses the no-args constructor of Type to create a new instance 
    Type item = cls.newInstance(); 

    // ... 
} 

另一種更靈活的方式是提供一個工廠來創建的Type實例。這樣做的一個缺點是你需要爲每個BaseItem的子類實現一個工廠,你想用它來做這件事。

public interface Factory<T> { 
    T create(); 
} 

// ... 

public void processObject(Map<?, ?> map, Factory<Type> factory) { 
    // Calls the factory to create a new Type 
    Type item = factory.create(); 

    // ... 
} 

// Factory implementation for BaseItem 
public class BaseItemFactory implements Factory<BaseItem> { 
    @Override 
    public BaseItem create() { 
     return new BaseItem(); 
    } 
} 
+0

明確的工廠是迄今爲止做到這一點的最佳方式。 – 2012-03-29 14:57:56

+0

我解決了這個問題,通過提取BaseArrayList的超類 - 所以我已經抽象BAArrayList <類型擴展BaseItem>與抽象方法newObject(); – Yanny 2012-03-30 13:30:12