如何在java中实现我自己的泛型集合?

时间:2016-05-07 12:27:32

标签: java generics collections

我只有两个方法接口'MyCollection':addAll和containsAll,它们将参数作为通用集合。如何在我的类中有效地实现这些方法,以便它们可以在任何类型的集合上工作。 这就是我到目前为止所做的:

界面:

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()和addAll()时,在我的类中未选中调用'containsAll(Collection)作为原始类型'Java.Util.Collection'的成员。 那么我该如何解决这个问题呢?非常感谢提前!

2 个答案:

答案 0 :(得分:1)

ET都延伸Collection,但您希望在此行的T中将集合视为MyCollection

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

这可能是错误的,因为每个Collection都不属于T类型。

无论如何,如果您确定此类型转换是安全的,只需忽略它并使用

@SuppressWarnings("unchecked")

取消该警告。

答案 1 :(得分: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);