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

はい、PlayingCards を含めることができます

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

では、配列は PlayingCards ではなく Objects でなければならないのでしょうか?

提供したジェネリックではなく、インターフェイスから実装された「奇妙な」関数を取得するのはなぜですか? 私は何を逃したのですか?

4

2 に答える 2

8

パラメータとしてCollection.contains(Object)持っているためです。Objectとして定義されていませんCollection.contains(E)。その理由については、ここで詳細な説明を見つけることができます。

于 2013-06-18T19:29:31.290 に答える
3

public Object[] toArray()は interface で宣言されており、ジェネリックjava.util.Collectionではありません。だけでなくcontains(Object o)。それらは、実装するインターフェースでそのように(非ジェネリックに)宣言されます。

于 2013-06-18T19:30:34.157 に答える