2013-06-18 109 views
2

我有这样的接口:为什么我的java类实现我不指望的方法?

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

是的,它可以包含PlayingCards

@Override 
    public boolean addAll(Collection<? extends PlayingCard> c) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

这是好的,我想,只要收集元件延伸游戏牌,虽然这不符合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; 
} 

所以任何数组必须是对象,而不是播放卡?

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

回答

8

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

+1

我总是想知道是否有人在那里,只有一个人,谁实际上使用这种行为做一件好事。因为很多人觉得这很刺激。 –

+0

@Slanec我对这个答案和评论的看法越多,我认为这就越向后兼容。 –

+3

+1,它不是为了向后兼容。 '包含','删除'等采取'对象',因为'equals'采用'Object'并且它们的合约委托给'equals'合约。 –

3

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

+0

我想在这里你实际上可以用'public PlayingCard []将它替换为使用协变返回类型的Array()'。 –

+0

@ThoHawtin-tackline照顾解释? – Pureferret

+2

@Pureferret您可以收紧已实施/重写方法的返回类型(从J2SE 5.0开始)。 'PlayingCard []'是'Object []'的子类型(专业化),尽管它不应该如此。 –

相关问题