2013-06-18 31 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 []'的子類型(專業化),儘管它不應該如此。 –

相關問題