2016-05-07 13 views
1

Ich habe eine Schnittstelle 'MyCollection' mit nur zwei Methoden: addAll und containsAll, die als eine generische Auflistung als Parameter verwenden. Wie kann ich diese Methoden effektiv in meiner Klasse implementieren, so dass sie für jede Art von Sammlung funktionieren. Dies ist, was ich bisher getan:Wie kann ich meine eigene generische Sammlung in Java implementieren?

Die Schnittstelle:

interface MyCollection<T extends Collection> { 
    boolean containsAll(T c); 
    boolean addAll(T c); 
} 

Meine Klasse, wo ich die Methoden implementieren:

public class MyPersonalCollection<E extends Collection> implements MyCollection { 
     private E myCollection; 

     public MyPersonalCollection(E myCollection) { 
      this.myCollection = myCollection; 
     } 

     public boolean containsAll(Collection c) { 
      return myCollection != null && myCollection.containsAll(c); 
     } 

     public boolean addAll(Collection c) { 
      return myCollection != null && myCollection.addAll(c); 
     } 
    } 

Und die Tests:

@Test 
    public void testIfNewCollectionCanBeAdded() { 
     ArrayList<String> input = new ArrayList<>(); 
     MyPersonalCollection<ArrayList<String>> myCollection = new MyPersonalCollection<>(input); 

     input.add("first"); 
     input.add("secon"); 
     input.add("third"); 

     assertTrue(myCollection.addAll(input)); 
    } 

    @Test 
    public void testIfMyCollectionContainsAnotherCollection() { 
     LinkedList<String> list = new LinkedList<>(); 
     MyPersonalCollection<LinkedList<String>> myCollection = new MyPersonalCollection<>(list); 

     list.add("bacon"); 
     list.add("tuna"); 
     list.add("steak"); 
     assertTrue(myCollection.addAll(list)); 
    } 

Ich bekomme auch eine Warnung: Ungeprüfter Aufruf von 'containsAll (Collection) als Mitglied des Rohtyps' Java.Util.Colle ction "in meiner Klasse, wenn ich die Methoden containsAll() und addAll() aufruft. Also, wie kann ich dieses Problem angehen? Vielen Dank im Voraus !

+0

Die Namensgebung legt nahe, hier eine Verwirrung. Sie implementieren keine Collection, Sie implementieren einen Typ, der eine Collection verwendet. Plus, "Sammlung" hat bereits beide Methoden, die Sie definieren ... Vielleicht erstellen Sie Hilfsmethoden für Sammlungen und nicht für eine Sammlung an und für sich. Beachten Sie auch, dass Ihre Methodensignatur es derzeit erlaubt, ein 'Set ' zu einer 'Liste ' hinzuzufügen, deren Bedeutung zumindest verwirrend, wenn nicht fehleranfällig ist. – GPI

+0

@Gustavo bitte meine Antwort sehen. Ich denke, es löst dein Problem – Troncador

Antwort

1

Sowohl E und T erweitern Collection, aber Sie wollen eine Sammlung als T in MyCollection in dieser Linie behandeln:

return myCollection != null && myCollection.containsAll(c); 

was falsch sein kann, weil jeder Collection nicht vom Typ ist T.

Wie auch immer, wenn Sie sicher sind, dass diese Art Casting sicher, einfach ignorieren und

@SuppressWarnings("unchecked") 

verwenden, um diese Warnung zu unterdrücken.

0

Das Problem ist, dass Sie 2 generisch zu definieren:

  • C für die Art der Sammlung
  • E für den Inhalt der Sammlung

Ich reparierte Ihr Code, jetzt gibt es keine Warnungen

interface MyCollection<C> { 
    boolean containsAll(C c); 
    boolean addAll(C c); 
} 

public class MyPersonalCollection<E, C extends Collection<E>> 
    implements MyCollection<C> { 
    private C collection; 

    public MyPersonalCollection(C myCollection) { 
    this.collection = myCollection; 
    } 

    public boolean containsAll(C c) { 
    return collection != null && collection.containsAll(c); 
    } 

    public boolean addAll(C c) { 
    return collection != null && collection.addAll(c); 
    } 
} 

Sie können Ihre Klasse im Test wie folgt verwenden:

MyPersonalCollection<String, LinkedList<String>> myCollection = 
    new MyPersonalCollection<String, LinkedList<String>>(list); 
Verwandte Themen