我只有两个方法接口'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'的成员。 那么我该如何解决这个问题呢?非常感谢提前!
答案 0 :(得分:1)
E
和T
都延伸Collection
,但您希望在此行的T
中将集合视为MyCollection
:
return myCollection != null && myCollection.containsAll(c);
这可能是错误的,因为每个Collection
都不属于T
类型。
无论如何,如果您确定此类型转换是安全的,只需忽略它并使用
@SuppressWarnings("unchecked")
取消该警告。
答案 1 :(得分: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);