2012-03-29 12 views
0

Ich bin neu in Java. Ich entwickle Programm für Android ähnlich App für iOS. Einer der Zwecke der App - erhalten Daten vom Server. Daten sind oft Array mit Wörterbücher wie "ID = 1", "Name = SomeName". Ich habe KlasseErstelle Instanz der Klasse oder Superklasse vom generischen Typ

class BaseArrayList<Type extends BaseItem> extends BaseItem { 

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

Auch BaseItem haben Methode create():

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

Es funktioniert, aber für sublass von BaseItem -es funktioniert nicht. Ich habe festgestellt, dass statische Methoden nicht überschrieben werden.

Also, wie kann ich diese Aufgabe lösen: benutzerdefinierte Klasse in Array erstellen mit nur individuellen Fällen von BaseArrayList Schaffung wie:

new BaseArrayList<SomeSublassOfBaseItem> 

Dieses Problem wird in ObjC wie dieses Problem gelöst -

[[memberClass alloc] init]; 
+0

Typ item = Typ.newInstance(); –

+0

Werfen Sie einen Blick auf "Warum erlaubt Java nicht das Überschreiben von statischen Methoden?" http://StackOverflow.com/Q/2223386/1250303 – Java42

+0

@AlexeiKaigorodov Das wird nicht für einen beliebigen Typ funktionieren. – Jesper

Antwort

1

Ich habe festgestellt, dass statische Methoden nicht überschrieben werden.

In der Tat, überschreiben funktioniert nicht für statische Methoden.

Es gibt verschiedene Möglichkeiten, um das zu erreichen, was Sie tun möchten. Eine davon ist ein Class<Type> Objekt in den processObject Methode zu übergeben, die Sie Instanzen von Type aus zu erstellen, indem Aufruf newInstance() auf sie verwenden können:

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

    // ... 
} 

Ein weiterer flexibler ist eine Fabrik zu liefern Instanzen Type zu erstellen. Ein Nachteil davon ist, dass Sie eine Factory für jede Unterklasse von BaseItem implementieren müssen, die Sie dafür verwenden möchten.

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

Eine explizite Fabrik ist bei weitem der beste Weg, dies zu tun. –

+0

Ich habe dieses Problem gelöst, indem ich superclass für BaseArrayList extrahiert habe - also habe ich abstrakt BAArrayList mit der abstrakten Methode newObject(); – Yanny

Verwandte Themen