我正在尝试创建一个包含不同类实例的数组列表。如何在不定义类类型的情况下创建列表?(<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
。
当您从此列表中检索一个元素时,您将检索到 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
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<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
List anyObject = new ArrayList();
or
List<Object> anyObject = new ArrayList<Object>();
现在anyObject
可以抱了objects of any type
。
使用instanceof来了解what kind of object it is
。
如果您不能比Object
您的实例更具体,请使用:
List<Object> employees = new ArrayList<Object>();
否则尽可能具体:
List<? extends SpecificType> employees = new ArrayList<? extends SpecificType>();
如何在不定义类类型的情况下创建列表?(
<Employee>
)
如果我没看错,你只是想避免指定类型,对吗?
在 Java 7 中,你可以做
List<Employee> list = new ArrayList<>();
但是正在讨论的任何其他替代方案都只会牺牲类型安全性。
我看到所有答案都建议使用一个填充了 Object 类的列表,然后显式转换所需的类,我个人不喜欢这种方法。
对我来说更好的是创建一个接口,其中包含用于从/向我想要放入列表的某些类中检索或存储数据的方法。让这些类实现该新接口,将接口中的方法添加到它们中,然后您可以用接口对象填充列表 -List<NewInterface> newInterfaceList = new ArrayList<>()
因此能够从列表中的对象中提取所需的数据,而无需显式转换任何内容。
如果需要对列表进行排序,也可以在界面中放置一个比较器。
我知道这是一个老问题,但有一种很好且简单的方法可以做到这一点(它适用于最新版本的 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 代表具有命中源参数的类。