Javaでは、APIで具象クラスではなくインターフェース型を使用することをお勧めします。
あなたの問題は、あなたがArrayList
本当に使うべき場所で(おそらく多くの場所で)使っているということList
です。その結果、リストがであるという不必要な制約を伴う問題が発生しましたArrayList
。
コードは次のようになります。
List input = new ArrayList(...);
public void doSomething(List input) {
List inputA = input.subList(0, input.size()/2);
...
}
this.doSomething(input);
問題に対して提案された「解決策」は次のとおりです。
new ArrayList(input.subList(0, input.size()/2))
これは、サブリストのコピーを作成することで機能します。通常の意味でのスライスではありません。さらに、サブリストが大きい場合、コピーの作成にはコストがかかります。
変更できないAPIに制約されている場合は、inputA
として宣言する必要があります。ArrayList
ArrayList
、subList
メソッドがのサブクラスを返すカスタムサブクラスを実装できる可能性がありArrayList
ます。しかしながら:
- 設計、実装、テストするのは大変な作業です。
- これで、コードベースに重要な新しいクラスが追加されました。おそらく、クラスの文書化されていない側面(したがって「変更される可能性がある」)の側面に依存してい
ArrayList
ます。
- 作成しているコードベースの関連する場所を変更する必要があります
ArrayList
代わりに、サブクラスのインスタンスを作成するために、インスタンスを作成ます。
「アレイをコピーする」ソリューションはより実用的です...これらは真のスライスではないことを念頭に置いてください。
ArrayList
ですか?インターフェースがどのように機能するかを少し理解していないかもしれません。なぜならList
、ArrayList
「互換性がない」わけではなく、ArrayList
実装されてList
おり、List
おそらく必要なすべてのメソッドが含まれているからです。