2012-03-29 10 views
0

私はJavaで新しいです。 私はiOS向けのアプリに似たAndroid向けのプログラムを開発しています。 アプリケーションの目的の1つは、サーバーからデータを取得することです。 データは、 "id = 1"、 "name = 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ため-itは動作しません。 静的メソッドがオーバーライドされていないことがわかりました。

[[memberClass alloc] init]; 
+0

タイプitem = Type.newInstance(); –

+0

「Javaが静的メソッドのオーバーライドを許可しないのはなぜですか? http://stackoverflow.com/q/2223386/1250303 – Java42

+0

@AlexeiKaigorodovこれは、任意のタイプでは動作しません。 – Jesper

答えて

1
- この問題は、このようにObjCで解決

new BaseArrayList<SomeSublassOfBaseItem> 

:ちょうどのようなBaseArrayListのカスタムインスタンスを作成すると、アレイ内のカスタムクラスを作成します。私は、このタスクを解決することができますどのように

静的メソッドがオーバーライドされていないことがわかりました。

実際、オーバーライドは静的メソッドでは機能しません。

あなたがしたいことを達成するためのさまざまな方法があります。

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のインスタンスを作成するための工場を供給することである:一つは、あなたがそれにnewInstance()を呼び出してからTypeのインスタンスを作成するために使用することができ、あなたのprocessObject方法にClass<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

これを行うには明示的な工場がはるかに良い方法です。 –

+0

私はBaseArrayListのスーパークラスを抽出してこの問題を解決しました。 - 抽象メソッドnewObject()を使用して抽象的なBAArrayList を作成しました。 – Yanny

関連する問題