質問

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 はジェネリック型なので (当然ですが)、これはできません。それが何を意味するかはわかりますが、現時点ではこの問題の解決策が思いつきません。

それを解決するのを手伝ってくれませんか?ありがとう!

役に立ちましたか?

解決

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

public class PhonebookEntryList implements List<PhonebookEntry>

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

public class PhonebookEntryList extends ArrayList<PhonebookEntry>

または

public class PhonebookEntryList extends LinkedList<PhonebookEntry>

他のヒント

一覧はインターフェイスであるため、

あなたはそれを行うことはできません。しかし! あなたが拡張またはPhonebookEntryListを作るために、Listクラスを実装するべきではありません、それは設計上のエラーです。

あなたが行う必要があります:

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ではなく、それを継承するのリストが含まれている必要があります。

List<T>は、インタフェース、クラスではないので、あなたはそれを継承することはできません。あなたが作成したい場合は、しかし、例えば、型引数を供給、ジェネリック型を継承することができます唯一のそのタイプに固有のいくつかの動作と特定のタイプの収集ます。

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

作曲は、あなたが望むものです。リスト(またはそのインターフェイスをiplements何かを)wrappsクラスを作成します。

や機能を追加します。

私はリストがインターフェイスではなくクラスであることを言及すべきか?いや。私は、あなたが今ではポイントを得たと考えています。

私はそれがリストクラス内の永続性メカニズムを埋め込まない方が良いでしょうということ、しかし、指摘したいと思います。良い作品Visitorパターンと呼ばれるこの事があります。別々のクラスに実際の永続性のコードを配置することで、アプリの全体的な論理的な複雑さは、(余分なクラスを犠牲にして)減少し、そしてあなたの電話帳には、永続性のメカニズムに依存関係を持つことは良い見の場所で使用できるように解放さになりますあなたは、最初のコードを設計したときにはもうあまり良く見ていません。あなたが作りたかった場合例えば、電話帳は、ORM-参照されるデータベース内のアイテムになります。

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

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

を実装したい場合は、 List コードを次のように変更します。 implements List<PhonebookEntry>

Listのための

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

注:誰かがJavaのコレクションクラスのいずれかを拡張するために開始したときの時間のほとんどは、あなたが間違ったルートを下っています。通常、それはあなたのクラスとプロキシの既存のコレクションあなたが必要なすべてのコレクションスタイル要求のいずれかを使用することをお勧めします。またはあなたのコレクションの変更不可能なプロキシを返します:

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

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

通常、それはあなたが拡張しているクラスとは異なる振る舞いを持ってする場合にのみ、クラスを拡張するのが最善です。継承は、組成物よりも脆いです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top