2017-11-11 3 views
1

Ich bin ein Java-Neuling. Ich muss einen Konstruktor MyArrayList(Object type) definieren, um den Typ der Referenz festzulegen, die später zu der Liste hinzugefügt wird.Wie lege ich den Referenztyp für die Liste fest?

Die Signatur des Konstruktors kann nicht geändert werden. Auch ich bin nicht erlaubt zu verwenden Generika.

Ich versuche tun es wie folgt aus:

public class MyArrayList implements MyList { 
private Object[] theList; // array of objects 


public MyArrayList(Object type) { 
    theList = new type[0]; 

} 

und einen Compiler-Fehler erhalten, da type keine Klasse. Was ist der richtige Weg?

+0

Verwenden Sie Generika und Graben Sie den Konstruktor vollständig. – luk2302

+0

* "und einen Kompilierfehler bekommen" * - schreiben Sie uns immer den vollen Fehler, den Sie bekommen. Andernfalls werden Sie Ihr Publikum auf Leute reduzieren, die sofort wissen, was das Problem ist. – Zabuza

+0

@abovady Wenn ein Benutzer Ihre Frage beantwortet, akzeptieren Sie auch seine Antwort ([Antworten annehmen: Wie funktioniert es?] (Https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer- Arbeit)). Wenn nicht, dann geben Sie bitte an, was unbeantwortet bleibt, dies ist ein wichtiger Teil von StackOverflow, vielen Dank. – Zabuza

Antwort

0

Wie sagten Sie, dass Sie nichtGenerika verwenden möchten, können Sie Arrays dynamisch über Array#newInstance (documentation) erstellen. Hier ist Ihre angepassten Code:

public class MyArrayList implements MyList { 
    private Object[] theList; 

    public MyArrayList(Object type) { 
     // Adjust as you like 
     int size = 0; 
     // Dynamically create array of type "type" 
     theList = (Object[]) Array.newInstance(type.getClass(), size); 
    } 
} 

Da Sie nicht wissen, die Klasse bei der Kompilierung nur als Object[] verwenden kann, aber es ist nur Elemente der wahren Art von type zur Laufzeit ermöglicht, sobald der Typ bekannt, nicht beliebig Object s.


anzumerken, dass Arrays sind von fester Größe . Sie können nicht einfach Elemente hinzufügen, die Größe ist immer fest und muss im Voraus bekannt sein. Wenn Sie eine dynamischere Struktur benötigen, verwenden Sie etwas wie List (ArrayList oder LinkedList zum Beispiel).

Sie können dann nur nicht vergessen, das Objekt type gegeben und wenn ein Benutzer ein Element hinzuzufügen versucht, überprüfen Sie für element instanceof type und nur hinzufügen, wenn das true zurückgibt, andernfalls eine Ausnahme wie IllegalArgumentException oder so werfen.

Oder alternativ, wie gesagt, eine gute feste Größe für Ihr Array einstellen. Sie können diese Auswahl auch dem Benutzer geben, indem Sie in Ihrem Konstruktor einen Parameter size angeben.

+0

Vielen Dank, ich habe versucht, Ihre Lösung zu implementieren, aber ich bekomme einen Compiler-Fehler "Typ nicht übereinstimmen", wenn ich dynamisch ein Array erstellen. 'newInstance' gibt ein Objekt zurück und 'theList' ist Objekt []. – abovady

+0

@abovady Ich habe den Code bearbeitet und eine Umwandlung zu 'Object []' hinzugefügt, da die Methode anstelle des Arrays ein 'Objekt' zurückgibt (aber der wahre Typ ist tatsächlich das Array). Kannst du es nochmal versuchen? – Zabuza

+0

Danke, es hat funktioniert. Die Größe meines Arrays ist flexibel. Ich füge Elemente am Ende des Arrays hinzu, wenn das hinzugefügte Element die Grenzen überschreitet. Ich mache es, indem ich ein neues Array mit der Länge + 1 erstelle und den Inhalt des alten Arrays in ein neues Array kopiere. – abovady

0

Die Antwort auf ein solches Szenario in Java ist "Generika". Die offizielle documentation für Java ist ein guter Ort, um über Generika zu lernen.

Für dieses Szenario Sie den Code schreiben können als

Die Schnittstelle

Liste folgt
package test.generics; 

public interface MyList<T> { 
    T get(int index); 
    void add(T input); 
    void clear(); 
} 

Die Implementierung

package test.generics; 

public class MyArrayList<T> implements MyList<T> { 

    private Object[] storage = new Object[10]; 
    private int index = 0; 

    @SuppressWarnings("unchecked") 
    @Override 
    public T get(int index) { 
     T temp = null; 
     if (!(index < 10 && index >= 0)) { 
      throw new IllegalArgumentException("Expected range 0 to 9"); 
     } else { 
      temp = (T) storage[index]; 
     } 
     return temp; 
    } 

    @Override 
    public void add(T input) { 
     if (index < 10) { 
      storage[index++] = input; 
     } else { 
      throw new IllegalArgumentException("Only 10 items supported"); 
     } 
    } 

    @Override 
    public void clear() { 
     index = 0; 
    } 

} 

Der Verbraucher

package test.generics; 

public class Consumer { 

    public static void main(String[] args) { 
     MyList<Integer> intList = new MyArrayList<>(); 
     intList.add(10); 
     System.out.println(intList.get(0)); 
     MyList<String> stringList = new MyArrayList<>(); 
     stringList.add("hello"); 
     System.out.println(stringList.get(0)); 
    } 

} 
+0

Ich verstehe Ihre Lösung, aber ich darf keinen Typparameter verwenden. Ich muss einen Konstruktor mit der von mir beschriebenen Signatur verwenden. – abovady

Verwandte Themen