2016-07-01 1 views
2

In diesem Code erzeugt die letzte Zeile (list1.addAll(list2);) Fehler Die Kompilierung-Fehler bei der Kompilierung mit List.addAll zum Hinzufügen einer Liste <? erstreckt Baseclass> zu einem anderen

Die Methode addAll (Sammlung <? erstreckt capture # 3-of? erstreckt Baseclass>) in der Typ Liste < erfassen # 3-von? erstreckt Baseclass> ist nicht anwendbar für die Argumente (List < Capture # 4-of? erweitert Baseclass>)

ich erkennen, dass dies, wenn durfte es möglich wäre, auf die gleiche Liste Instanzen verschiedener Klassen hinzufügen . Ich weiß jedoch nicht, was der richtige Weg ist.

Meine getList() Methode muss Subklassen von BaseClass zurückgeben, ich kann diese Anforderung nicht ändern.

Ich habe diese zwei Listen, auf die gleiche Weise deklariert und enthält die gleiche Art von Objekten, und ich muss eine in die andere hinzufügen. Irgendwelche Gedanken dazu würden geschätzt.

BaseClass.java:

package main; 

public class BaseClass {} 

Main.java:

package main; 

import java.util.ArrayList; 
import java.util.List; 

public class Main { 

    private static List<? extends BaseClass> getList() { 

     return new ArrayList<>(); 
    } 

    public static void main(String[] args) { 

     List<? extends BaseClass> list1 = getList(); 

     List<? extends BaseClass> list2 = getList(); 

     list1.addAll(list2); // Compile-time error: "The method addAll(Collection<? extends capture#3-of ? extends BaseClass>) in the type List<capture#3-of ? extends BaseClass> is not applicable for the arguments (List<capture#4-of ? extends BaseClass>)". 
    } 

} 

Antwort

4

Sie könnten eine neue List<BaseClass> machen und beide Listen hinzufügen, dass:

List<BaseClass> merged = new ArrayList<>(); 
merged.addAll(list1); 
merged.addAll(lise2); 

Aber es könnte eine bessere Idee sein, getList eine List<BaseClass> zurückgeben.

2

Der Compiler kann nicht feststellen, dass die Klassen kompatibel sind.

In Beispiel list1 könnte von dem Typ sein

List<SubSubSubClass> 

und Sie versuchen, eine Baseclass hinein zu verschmelzen. Sie können BaseClass nicht in eine zufällige Unterklasse umwandeln. Auch :

List<? extends BaseClass> list1 

Wird eine Liste von Objekten deklarieren, die auf Baseclass basieren, aber das Folgende tun das gleiche:

List<BaseClass> list1 

Try this:

private static List<BaseClass> getList() { 

    return new ArrayList<BaseClass>(); 
} 
public static void main(String[] args) { 

    List<BaseClass> list1 = getList(); 

    List<BaseClass> list2 = getList(); 

    list1.addAll(list2); 
} 

Dadurch wird gewährleistet, dass Ihre Listenelemente sind alle vom BaseClass-Typ oder von Unterklassen dieses Typs.

+2

Gut, dass 'List list1' eine Liste von Objekten deklariert, die auf' BaseClass' basieren, genau wie meine 'List list1' tut. Allerdings kann ich den Rückgabetyp von 'getList()' nicht ändern, da ich ihn irgendwo anders überschreiben muss und eine Liste von verschiedenen Unterklassen von 'BaseClass' zurückgeben muss. – SantiBailors

Verwandte Themen