14

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

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

8 回答 8

23

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

当您从此列表中检索一个元素时,您将检索到 anObject而不再是 an 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
于 2012-06-17T17:55:58.917 回答
11
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>();
于 2012-06-17T17:56:22.063 回答
2

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

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

于 2012-06-17T18:03:28.730 回答
2

List anyObject = new ArrayList();

or

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

现在anyObject可以抱了objects of any type

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

于 2012-06-17T18:01:42.827 回答
1

如果您不能比Object您的实例更具体,请使用:

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

否则尽可能具体:

List<? extends SpecificType> employees = new ArrayList<? extends SpecificType>();
于 2012-06-17T17:56:28.803 回答
1

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

如果我没看错,你只是想避免指定类型,对吗?

在 Java 7 中,你可以做

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

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

于 2012-06-17T18:11:44.140 回答
0

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

对我来说更好的是创建一个接口,其中包含用于从/向我想要放入列表的某些类中检索或存储数据的方法。让这些类实现该新接口,将接口中的方法添加到它们中,然后您可以用接口对象填充列表 -List<NewInterface> newInterfaceList = new ArrayList<>()因此能够从列表中的对象中提取所需的数据,而无需显式转换任何内容。

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

于 2020-06-05T12:43:46.173 回答
0

我知道这是一个老问题,但有一种很好且简单的方法可以做到这一点(它适用于最新版本的 ElasticSearch Rest API)。

搜索对象如下:

 SearchResponse<JsonData> search = client.search(s -> s
  .index(index)
  .query(query),
  JsonData.class);

然后我像这样迭代响应:

 for (Hit<JsonData> hit: search.hits().hits()) {
  String stringSource = hit.source().toString();
  MySavedRegister mySavedRegister = mapper.readValue(stringSource, mySavedRegister .class);
  mylist.add(esGenericEvent);
 }

其中 mySavedRegister 代表具有命中源参数的类。

于 2022-01-07T12:23:59.450 回答