Employee
クラスがあるとします。ジェネリックを使用せずに要素ArrayList
のみを実装するにはどうすればよいですか? Employee
つまり、 なしで、オブジェクトのみを追加するArraylist<Employee>
ように制限するにはどうすればよいですか?ArrayList
Employee
6 に答える
ArrayList を拡張してカスタマイズadd()
し、addAll()
追加中のオブジェクトを確認するメソッドがinstanceof
Employee
たとえば、employeeList と呼ばれるプライベート ArrayList フィールドを保持するラッパー クラスを使用できます。
public void add(Employee employee) {
employeeList.add(employee);
}
外部クラスが制御された方法で ArrayList と対話できるようにするその他の必要なメソッド。
これには、継承よりも構成を使用する方がはるかに優れていると思います。そうすれば、ArrayList から別のもの (LinkedList など) に変更したい場合、またはまったく異なるものに変更したい場合でも、簡単に処理できます。
使用できますCollections.checkedList()
が、ジェネリックを使用したくないのはなぜですか?
非常に古いバージョンのJavaとの互換性など、ジェネリックス自体を避けたい場合は、ArrayListを拡張またはラップしても役に立ちません。おそらく、同じ機能を持つ別の配列実装を見つけるか、作成する必要があります。
基本的に、ArrayListは、必要に応じてデータをコピーしてより大きな配列に貼り付けるプリミティブ配列の単なるラッパーであるため、これを最初から作成することは特に難しくありません。
「制限」するとき、あなたは正確に何を望んでいますか?制限を設ける可能性のある場所は 2 つあります。コンパイル時または実行時です。
ジェネリックは純粋にコンパイル時のものです。正しいコードを書くのに役立ちますが、それをバイパスして配列に間違った型を入れても、実行時に文句を言うことはありません。
一方、Collections.checkedList()
ランタイムの制限のようなものがあります。間違った型のオブジェクトが来ると、実行時にエラーをスローします。ただし、ジェネリックがない場合、コンパイル時には役に立ちません。
したがって、この 2 つのことは直交しており、どちらも他方の代わりにはなりません。正確には何が欲しいですか?
クラスをサブクラス化し、 のArrayList
ような名前を付けますEmployeeArrayList
。