何らかのリストが必要なプログラムを考えてみましょう。どんな種類のリストでもできますので、作成します。私はそれが良い習慣、あなたのオブジェクトをインスタンス化するとき、あなたはそのインタフェースを使用する必要が何かをやっている場合は、インターフェースとしてそれらを定義しますが、必ずしもその特定の具体的なクラスにするだと聞いた具体的なクラスのインタフェースをインスタンス化する
List<Integer> example = new LinkedList<Integer>();
。たとえば、 "example"リストを代わりにArrayListにすることができました。
しかし、私のLinkedListをこのような方法でListインターフェイスとして定義すると、私には限界があります。たとえば、LinkedList固有のメソッドを使用することはできません。 Listインターフェイス自体にあるメソッドのみを使用できます。以来する「例」をキャストすることにより、目的を倒すように思わ
((LinkedList)example).addLast(1);
...:私は私のLinkedList固有のメソッドがそうのように、LinkedListのに例をキャストしている使用することを見つけた唯一の方法私はLinkedListを作成し、Listの代わりにLinkedListであると定義しています。
なぜ具体的なクラスを作成してインターフェイスで定義するのがよいのでしょうか?私が紛失しているものがありますか?
具体的なクラスで継承されていないメソッドを絶対に使用する必要がある場合は、その変数を具体的なクラスタイプの変数として宣言する必要があります。人生はトレードオフに満ちており、これを行うことによって柔軟性が失われています。もう1つのオプションは、継承されていない具象メソッドを使う必要がなく、キャストする必要がないようにコードを書くことです(ここで目的を破ってしまいます)。 –
良い方法は、表現したいものの一番上のインターフェースを使って変数を宣言することです。 'addLast'を呼び出せる型を表現したいなら、' List'を使わず、 'Deque'を使います。 – Tunaki
具体的な型の代わりにインタフェースを使用することは、メソッドのパラメータの場合には私にとって最も理にかなっています。ユーザーにどのタイプのものを渡すかをより柔軟にすることは、良いことです。 counterの例は '' 'CharSequence'''の代わりに' '' String''です.''''String''は不変性を提供するからです。 –