2

我有这个界面:

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

是的,它可以包含扑克牌

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

所以任何数组都必须是对象,而不是扑克牌?

为什么我从我的界面实现了“奇怪”的功能,而不是我提供的泛型?我错过了什么?

4

2 回答 2

8

因为Collection.contains(Object)Object作为它的参数。它没有定义为Collection.contains(E). 至于为什么会这样,你可以在这里找到详细的解释。

于 2013-06-18T19:29:31.290 回答
3

因为public Object[] toArray()在接口中声明java.util.Collection,并且不是通用的。以及contains(Object o). 它们在您实现的接口中以这种方式(非通用)声明。

于 2013-06-18T19:30:34.157 回答