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として宣言する必要があります。ArrayListArrayList、subListメソッドがのサブクラスを返すカスタムサブクラスを実装できる可能性がありArrayListます。しかしながら:
- 設計、実装、テストするのは大変な作業です。
- これで、コードベースに重要な新しいクラスが追加されました。おそらく、クラスの文書化されていない側面(したがって「変更される可能性がある」)の側面に依存してい
ArrayListます。
- 作成しているコードベースの関連する場所を変更する必要があります
ArrayList代わりに、サブクラスのインスタンスを作成するために、インスタンスを作成ます。
「アレイをコピーする」ソリューションはより実用的です...これらは真のスライスではないことを念頭に置いてください。
ArrayListですか?インターフェースがどのように機能するかを少し理解していないかもしれません。なぜならList、ArrayList「互換性がない」わけではなく、ArrayList実装されてListおり、Listおそらく必要なすべてのメソッドが含まれているからです。