1

Java 言語を理解するのに少し問題があります

public class PhonebookEntryList extends List<PhonebookEntry>
{
    public PhonebookEntryList(String filename) throws IOException
    {
        //loadListFromFilename(filename);
    }

    public void saveListToFilename(String filename) throws IOException
    {
        //Do something to save it to a file
    }
}

List はジェネリック型 (もちろん) であるため、これを行うことはできません。それが何を意味するかはわかっていますが、現時点では、この問題の解決策が思いつきません。

それを解決するのを手伝ってもらえますか? ありがとう!

4

7 に答える 7

3

いいえ、あなたの唯一の問題は、あなたが; をしていることextendですinterface。代わりにそれをする必要がありますimplement

public class PhonebookEntryList implements List<PhonebookEntry>

動作するはずです。または、具体的なクラスを拡張することを好むかもしれません:

public class PhonebookEntryList extends ArrayList<PhonebookEntry>

また

public class PhonebookEntryList extends LinkedList<PhonebookEntry>
于 2009-06-01T15:55:47.887 に答える
3

List はインターフェースであるため、それはできません。しかし!List クラスを拡張または実装して PhonebookEntryList を作成しないでください。これは設計エラーです。

やったほうがいい:

public class PhonebookEntryList
{
    private List<PhonebookEntry> entries;

    public PhonebookEntryList(String filename) throws IOException
    {
        //loadListFromFilename(filename);
    }

    public void saveListToFilename(String filename) throws IOException
    {
        //Do something to save it to a file
    }
}

つまり、PhonebookEntryList には、継承するのではなく、リストを含める必要があります。

于 2009-06-01T15:56:22.507 に答える
0

List<T>インターフェースです。

クラスにしたい場合extendは、実装を選択する必要があります(ArrayList<T>多分):extends ArrayList<PhonebookEntry>

Listコードを次のように変更して実装する場合。implements List<PhonebookEntry>

于 2009-06-01T15:59:34.423 に答える
0

あなたの問題は、インターフェースを実装するのではなく、拡張しようとしていることです。

作曲はあなたが望むものです。リスト(またはそのインターフェースを実装するもの)をラップするクラスを作成します

機能を追加します。

于 2009-06-01T16:00:02.863 に答える
0

リストはインターフェイスであり、クラスではないことに言及する必要がありますか? いや。もう要点はわかったと思います。

ただし、通常はリスト クラス内に永続化メカニズムを埋め込まない方がよいことを指摘しておきます。ビジター パターンと呼ばれる、より適切に機能するものがあります。実際の永続化コードを別のクラスに配置することで、アプリの全体的な論理的複雑さが軽減され (追加のクラスが犠牲になります)、電話帳が解放されて、適切に見える永続化メカニズムに依存する場所で使用できるようになります。最初にコードを設計したときは、もう見栄えがよくありません。たとえば、電話帳を ORM 参照データベースのアイテムにしたい場合です。

于 2009-06-01T16:08:25.827 に答える
0

List<T>はクラスではなくインターフェイスなので、継承することはできません。ただし、作成したい場合は、型引数を指定してジェネリック型から継承できます。たとえば、その型にのみ固有の動作を持つ特定の型のコレクションなどです。

于 2009-06-01T15:55:57.467 に答える
0

のJavaDocをList見ると、(他の人が述べたように)それがクラスではなくインターフェースであることがわかります。最も可能性が高いのは、同じ JavaDoc ページの「すべての既知の実装クラス」を見ることAbstractListです。これを拡張します。または、非抽象List実装の 1 つを拡張します。

注: ほとんどの場合、誰かが Java Collection クラスの 1 つを拡張し始めるとき、あなたは間違った道を進んでいます。通常、クラス内の既存のコレクションの 1 つを使用し、必要なコレクション スタイルの要求をプロキシする方が適切です。または、コレクションの変更不可能なプロキシを返します。

public class MyClass {
  private final List<PhonebookEntry> myList = new LinkedList<PhonebookEntry>();

  public List<PhonebookEntry> getList() {
    return Collections.unmodifiableList(myList);
  }
}

通常、クラスを拡張するのは、拡張するクラスとは異なる動作を意図している場合にのみ行うことをお勧めします。継承は合成よりも脆い。

于 2009-06-01T15:58:13.020 に答える