0

詳細に行き詰まることなく、私のコードはライブラリを表し、各本は単語のセットを含むページのセットで構成されています。

独自の Set 実装を作成しました。

class PageSet<E> extends HashSet<E>(){
    public boolean set(int index, E e){....}
    ....
}

class WordSet<E> extends HashSet<E>(){
    public boolean set(int index, E e){....}
    ....
}

メイン クラスで Book を作成しようとすると、行き詰まりました。

Set<Set<Word>> dictionary = new PageSet<WordSet<Word>>();

その結果、型変換の不一致が発生します。しかし、それは非常に喜んで受け入れます

Set<Set<Word>> dictionary = new PageSet<Set<Word>>();

このような一般的なセットアップを使用するときに、私が間違っていることについて誰かが光を当てることができますか?

4

3 に答える 3

3

基本的に、PageSet<WordSet<Word>>は ではないSet<Set<Word>>ため、X<Subclass>は ではありませんX<Superclass>

もしあなたが言っていたら

Set<WordSet<Word>> dictionary = new PageSet<WordSet<Word>>();

それならそれもうまくいったでしょう。

于 2013-05-17T20:07:53.437 に答える
0

いずれにせよ、新しいコレクション型を作成しようとしている場合を除き、コレクションを拡張しないでください。サブクラスのスーパークラス メソッドの可視性を制限することはできないため、人々は次のように記述できます。

WordSet<Word> words = ...;
words.clear();

おそらく、クライアントにその権限を与えたくないでしょう。代わりに、継承の代わりに集約を使用してください。

class Word {
    private String text;
    private PartOfSpeech part;
    // Constructors, getters, setters, equals, hashCode are elided.
}

class Page {
    private int pageNumber;
    private Set<Word> contents = new HashSet<>();

public class Book {
    private String title;
    private List<Page> pages = new ArrayList<>();
}

本のページは直線的に並べられているため、リストを使用しました。なぜセットを使用したのかわかりません。ただし、どのような場合でも、コレクションをクラス内にカプセル化することで、クライアント コードに使用したいインターフェイスを正確に提供できます。可視性は意図的に選択されました。これは関連するクラスのクラスターのように見えますが、それらを変更したい場合があります。

于 2013-05-17T20:31:45.703 に答える