创建不同对象的实例列表

时间:2012-06-17 17:54:55

标签: java arrays class object arraylist

我正在尝试创建不同类实例的arraylist。如何在不定义类类型的情况下创建列表? (<Employee>)

List<Employee> employees = new ArrayList<Employee>();
employees.add(new Employee());
Employee employee = employees.get(0);

7 个答案:

答案 0 :(得分:15)

您可以创建像List<Object> list = new ArrayList<Object>()这样的对象列表。由于所有类实现都从java.lang.Object类扩展了隐式或显式,因此该列表可以包含任何对象,包括EmployeeIntegerString等实例。

当您从此列表中检索元素时,您将检索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

答案 1 :(得分:8)

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>();

答案 2 :(得分:1)

List anyObject = new ArrayList();

or

List<Object> anyObject = new ArrayList<Object>();

现在anyObject可以保留objects of any type

使用 instanceof 来了解what kind of object it is

答案 3 :(得分:0)

如果您的实例不能Object,请使用:

List<Object> employees = new ArrayList<Object>();

否则请尽可能具体:

List<? extends SpecificType> employees = new ArrayList<? extends SpecificType>();

答案 4 :(得分:0)

我相信你最好的方法是将列表声明为对象列表:

List<Object> anything = new ArrayList<Object>();

然后你可以把你想要的东西放在里面,比如:

anything.add(new Employee(..))

显然,如果没有适当的演员,你将无法从列表中读取任何内容:

Employee mike = (Employee) anything.get(0);

我不鼓励使用原始类型,如:

List anything = new ArrayList()

由于泛型的整个目的正是为了避免它们,将来Java可能不再支持原始类型,原始类型被认为是遗留的,一旦你使用原始类型,你就不允许使用泛型。给出参考。例如,看看另一个问题:Combining Raw Types and Generic Methods

答案 5 :(得分:0)

  

如何在不定义类类型的情况下创建列表? (<Employee>

如果我正确阅读,你只想避免指定类型,对吗?

在Java 7中,你可以做到

List<Employee> list = new ArrayList<>();

但正在讨论的任何其他替代方案都将牺牲类型安全性。

答案 6 :(得分:0)

我看到所有答案都建议使用填充了Object类的列表,然后显式转换所需的类,而且我个人不喜欢这种方法。

对我来说,更好的方法是创建一个接口,该接口包含用于检索/存储要放入列表中的某些类的数据的方法。让那些类实现该新接口,将接口中的方法添加到其中,然后可以用接口对象-List<NewInterface> newInterfaceList = new ArrayList<>()填充列表,从而能够从列表中的对象中提取所需的数据明确地投射任何东西。

如果需要对列表进行排序,还可以在界面中放置一个比较器。