Javaでは、APIの具象クラスではなくインターフェイスタイプを使用することをお勧めします。
実際にList
を使用する必要があるArrayList
(多分多くの場所)を使用していることが問題です。その結果、リストが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))
サブリスト通常の意味でのスライスではありません。さらに、サブリストが大きい場合、コピーを作成するのは高価になります。
あなたは、あなたが、あなたはArrayList
のカスタムサブクラスを実装することができるかもしれない、に持ってArrayList
としてinputA
を宣言ようにあなたがを変更することはできませんのAPIによって制約されている場合はこれでsubList
メソッドが返しますArrayList
のサブクラスです。ただし:
- 設計、実装、テストするには多くの作業が必要です。
ArrayList
クラスの文書化されていないアスペクト(したがって、変更される可能性があります)に依存する可能性があり、コードベースに重要な新しいクラスを追加しました。
ArrayList
インスタンスを作成するコードベースの関連する場所を変更して、代わりにサブクラスのインスタンスを作成する必要があります。
「アレイをコピーする」ソリューションはより実用的です...これらは真のスライスではないことに留意してください。
使用すると、1つは、ArrayListの から削除する必要がある要素ののstartIndexとendIndexがendIndex
を開始すると終了インデックスはそれぞれ配列から削除されるように、al
は、元のArrayListとstartIndex
とする知っていれば、私は方法を発見した
なぜあなたは 'ArrayList'の使用を主張しますか? 'List'と' ArrayList'は ''互換性がありません ''' ArrayList''が 'List'を実装しているため、インターフェイスの仕組みが少し分からないかもしれないと思います。 – Bombe
私はArrayListの使用を主張しています。これは、厳密なメソッドプロトタイプのinteview質問です。私は明らかに、subListはList型を返すはずですが、返されたListをArrayListにキャストできないため、理解が不十分です。だからあなたは私に人を教えてくれます.. –
'ArrayList'を必要とするのは、' ArrayList'を受け入れるメソッドを呼び出す必要があるからです。おそらくこのような方法はあまり設計されておらず、代わりに 'List'を受け入れるべきですが、このような状況はインタビューの質問だけでなく、他人が書いたコードでも起こり得ます。同僚や図書館は必ずしも完璧というわけではありません。 – Gravity