为什么我的java类实现了我不期望的方法?

时间:2013-06-18 19:26:49

标签: java generics inheritance interface

我有这个界面:

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?

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

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:3)

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