2016-05-07 4 views
1

У меня есть inteface 'MyCollection' всего двумя способами: addAll и containsAll, которые принимают в качестве параметра общую коллекцию. Как я могу эффективно реализовать эти методы в своем классе, чтобы они работали над любым типом коллекции. Это то, что я сделал до сих пор:Как я могу реализовать свою собственную общую коллекцию в java?

Интерфейс:

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

Мой класс, где я реализую методы:

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); 
     } 
    } 

И тесты:

@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)); 
    } 

Я также получаю предупреждение: Непроверенный вызов 'containsAll (Collection) в качестве члена типа raw' Java.Util.Colle ction "в моем классе, когда я вызываю методы containsAll() и addAll(). Итак, как я могу решить эту проблему? Спасибо заранее !

+0

Именование здесь предполагает путаницу. Вы не реализуете коллекцию, вы реализуете тип, который использует коллекцию. Кроме того, 'Collection' уже имеет оба метода, которые вы определяете ... Может быть, вы строите методы утилиты вокруг коллекций, а не сами по себе Collection. Имейте в виду также, что ваша сигнатура методов теперь позволяет добавлять 'Set ' в 'Список ', смысл которого, по крайней мере, запутывает, если не подвержен ошибкам. – GPI

+0

@Gustavo посмотрите пожалуйста мой ответ. Я думаю, что он решает вашу проблему – Troncador

ответ

1

Оба E и T продлить Collection, но вы хотите, чтобы лечить Коллекцию как T в MyCollection в этой строке:

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

который может быть неправильно, потому что каждый Collection не от типа T.

В любом случае, если вы уверены, что это отливка типа безопасно, просто игнорировать его и использовать

@SuppressWarnings("unchecked") 

подавить это предупреждение.

0

Проблема заключается в том, что вы должны определить 2 родовое:

  • C для вида коллекции
  • E для содержания коллекции

Я фиксированной ваш код, в настоящее время нет предупреждений

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); 
    } 
} 

Вы можете использовать свой класс в тесте, как это:

MyPersonalCollection<String, LinkedList<String>> myCollection = 
    new MyPersonalCollection<String, LinkedList<String>>(list); 
Смежные вопросы