ジャバ:汎用リスト/コレクションからの派生
-
06-09-2019 - |
質問
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 はジェネリック型なので (当然ですが)、これはできません。それが何を意味するかはわかりますが、現時点ではこの問題の解決策が思いつきません。
それを解決するのを手伝ってくれませんか?ありがとう!
解決
いいえ、あなたの唯一の問題は、あなたがextend
をinterface
ingしているということです。あなたが代わりにそれを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
のための
注:誰かがJavaのコレクションクラスのいずれかを拡張するために開始したときの時間のほとんどは、あなたが間違ったルートを下っています。通常、それはあなたのクラスとプロキシの既存のコレクションあなたが必要なすべてのコレクションスタイル要求のいずれかを使用することをお勧めします。またはあなたのコレクションの変更不可能なプロキシを返します:
public class MyClass {
private final List<PhonebookEntry> myList = new LinkedList<PhonebookEntry>();
public List<PhonebookEntry> getList() {
return Collections.unmodifiableList(myList);
}
}
通常、それはあなたが拡張しているクラスとは異なる振る舞いを持ってする場合にのみ、クラスを拡張するのが最善です。継承は、組成物よりも脆いです。