我有这个界面:
public interface IDeck<T extends IDeck<T,S>,S extends ICard<S>> extends Comparable<T>, Collection<S>{
public Set<S> getDeck();
public void setDeck(Set<S> newDeck);
}
然后我创建一个类实现它,这里是标题和前几个方法:
public class PlayingCardDeck implements IDeck<PlayingCardDeck,PlayingCard> {
@Override
public int compareTo(PlayingCardDeck o) {
// TODO Auto-generated method stub
return 0;
}
到目前为止,我希望它具有可比性。
@Override
public boolean add(PlayingCard e) {
// TODO Auto-generated method stub
return false;
}
是的,它可以包含PlayCards
@Override
public boolean addAll(Collection<? extends PlayingCard> c) {
// TODO Auto-generated method stub
return false;
}
这是好的我想,只要集合元素扩展了PlayingCard,虽然这与add(PlayingCard e)
方法不匹配。
@Override
public boolean contains(Object o) {
// TODO Auto-generated method stub
return false;
}
坚持下去?为什么此处的类型为Object
而非PlayingCard
?
public Object[] toArray() {
// TODO Auto-generated method stub
return null;
}
所以任何数组都必须是Objects,而不是PlayingCards?
为什么我从界面实现'奇怪'功能,而不是我提供的泛型?我错过了什么?
答案 0 :(得分:8)
因为Collection.contains(Object)
有Object
作为参数。它没有定义为Collection.contains(E)
。至于为什么,你可以找到详细的解释here。
答案 1 :(得分:3)
因为public Object[] toArray()
在接口java.util.Collection
中声明,并且不是通用的。和contains(Object o)
一样。它们在您实现的接口中以这种方式声明(非泛型)。