2016-05-07 44 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)作为原始类型的成员'Java.Util.Colle我在调用方法containsAll()和addAll()时,在我的类中使用了“ction”。 那么我该如何解决这个问题呢?提前谢谢了 !

+0

命名这里提出了一种混乱。你没有实现一个Collection,你正在实现一个使用Collection的类型。另外,'Collection'已经有了你定义的两种方法......也许你正在围绕集合构建实用方法,而不是集合本身。请注意,您的方法签名目前允许在列表中添加一个'Set ',如果不容易出错,其含义至少是令人困惑的。 – GPI

+0

@古斯塔沃请看我的答案。我认为它解决了你的问题 – Troncador

回答

1

两个ET延长Collection,但你想在这一行对待集合作为TMyCollection

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

这可能是错误的,因为每一个Collection是不是从T型。

无论如何,如果你相信,这类型转换是安全的,简单地忽略它,并使用

@SuppressWarnings("unchecked") 

,以抑制警告。

0

的问题是,你必须定义2通用:

  • ç的那种收集
  • Ë的收集

我固定的内容你代码,现在没有警告

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