さまざまなクラス インスタンスの配列リストを作成しようとしています。クラス型を定義せずにリストを作成するにはどうすればよいですか?(<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>();
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 は生の型をサポートしなくなる可能性があり、生の型はレガシーと見なされ、生の型を使用すると、特定の参照でジェネリックを使用することはまったく許可されません。たとえば、この別の質問を見てください:生の型とジェネリック メソッドの結合
インスタンスよりも具体的にできない場合はObject
、次を使用します。
List<Object> employees = new ArrayList<Object>();
それ以外の場合は、できるだけ具体的にしてください。
List<? extends SpecificType> employees = new ArrayList<? extends SpecificType>();
クラス型を定義せずにリストを作成するにはどうすればよいですか? (
<Employee>
)
私がこれを正しく読んでいれば、タイプを指定する必要がないようにしたいだけですよね?
Java 7では、次のことができます
List<Employee> list = new ArrayList<>();
しかし、議論されている他の選択肢はどれも、型の安全性を犠牲にするだけです。