さまざまなクラスインスタンスの配列リストを作成しようとしています。クラスタイプを定義せずにリストを作成するにはどうすればよいですか? (<Employee>)
List<Employee> employees = new ArrayList<Employee>();
employees.add(new Employee());
Employee employee = employees.get(0);
List<Object> list = new ArrayList<Object>()
のようなオブジェクトのリストを作成できます。すべてのクラスの実装はJava.lang.Object
クラスから暗黙的または明示的に拡張されるため、このリストはEmployee
、Integer
、String
などのインスタンスを含む任意のオブジェクトを保持できます。
このリストから要素を取得すると、Object
を取得し、Employee
は取得しなくなります。この場合、次のように明示的なキャストを実行する必要があります。
List<Object> list = new ArrayList<Object>();
list.add("String");
list.add(Integer.valueOf(1));
list.add(new Employee());
Object retrievedObject = list.get(2);
Employee employee = (Employee)list.get(2); // explicit cast
List<Object> objects = new ArrayList<Object>();
objects
リストは、Object
のいずれかを受け入れます
次のように設計できます
public class BaseEmployee{/* stuffs */}
public class RegularEmployee extends BaseEmployee{/* stuffs */}
public class Contractors extends BaseEmployee{/* stuffs */}
リスト内
List<? extends BaseEmployee> employeeList = new ArrayList<? extends BaseEmployee>();
インスタンスをObject
より具体的に指定できない場合は、次を使用します。
List<Object> employees = new ArrayList<Object>();
それ以外の場合は、できるだけ具体的にしてください。
List<? extends SpecificType> employees = new ArrayList<? extends SpecificType>();
List anyObject = new ArrayList();
or
List<Object> anyObject = new ArrayList<Object>();
anyObject
が保持できるようになりましたobjects of any type
。
instanceofを使用して、what kind of object it is
。
あなたのベストショットは、リストをオブジェクトのリストとして宣言することだと思います:
List<Object> anything = new ArrayList<Object>();
その後、次のように好きなものを入れることができます:
anything.add(new Employee(..))
明らかに、適切なキャストをしないとリストから何かを読むことはできません。
Employee mike = (Employee) anything.get(0);
次のような未加工の型の使用はお勧めしません。
List anything = new ArrayList()
ジェネリックの全体的な目的はそれらを回避することであるため、将来的にJavaはrawタイプをサポートしなくなる可能性があります。rawタイプはレガシーと見なされ、rawタイプを使用すると、たとえば、次の質問をご覧ください: Raw型と汎用メソッドの組み合わせ
クラスタイプを定義せずにリストを作成するにはどうすればよいですか? (
<Employee>
)
私がこれを正しく読んでいるなら、タイプを指定する必要を避けたいだけです、正しいですか?
Java 7では、次のことができます
List<Employee> list = new ArrayList<>();
しかし、議論されている他の選択肢のいずれかは、型の安全性を犠牲にするだけです。