Java 创建不同对象的实例列表

Java 创建不同对象的实例列表,java,arrays,class,object,arraylist,Java,Arrays,Class,Object,Arraylist,我正在尝试创建不同类实例的arraylist。如何在不定义类类型的情况下创建列表() List employees=new ArrayList(); employees.add(newemployees()); Employee=employees.get(0); 您可以创建一个对象列表,如list list list=new ArrayList()。由于所有类的实现都从java.lang.Object类扩展为隐式或显式,因此此列表可以容纳任何对象,包括Employee、Integer、Stri

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

List employees=new ArrayList();
employees.add(newemployees());
Employee=employees.get(0);

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

从该列表中检索元素时,您将检索一个
对象
,而不再是
员工
,这意味着您需要执行显式强制转换,如下所示:

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 List=new ArrayList();
列表。添加(“字符串”);
list.add(整数.valueOf(1));
list.add(新员工());
objectretrievedObject=list.get(2);
员工=(员工)列表。获取(2);//显式转换
和在列表中

List<? extends BaseEmployee> employeeList = new ArrayList<? extends BaseEmployee>();

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

List<Object> employees = new ArrayList<Object>();
List employees=new ArrayList();
否则,请尽可能具体:

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

List
List anyObject=new ArrayList()


List anyObject=new ArrayList()

现在
anyObject
可以容纳任何类型的
对象


使用instanceof了解
它是什么类型的对象

我认为最好的办法是将列表声明为对象列表:

List<Object> anything = new ArrayList<Object>();
显然,如果没有正确的施法,您将无法读取列表中的任何内容:

Employee mike = (Employee) anything.get(0);
我不鼓励使用原始类型,如:

List anything = new ArrayList()
由于泛型的全部目的正是为了避免它们,因此在未来Java可能不再支持原始类型,原始类型被视为遗留类型,一旦使用原始类型,就不允许在给定引用中使用泛型。例如,看看这另一个问题:

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

如果我读对了,您只想避免指定类型,对吗

在Java7中,您可以

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

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

我看到所有的答案都建议使用一个充满对象类的列表,然后显式地强制转换所需的类,我个人不喜欢这种方法

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


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

不鼓励使用原始类型。Java语言规范甚至指出,Java编程语言的未来版本可能不允许使用原始类型。此外,使用extends会阻止向列表中添加元素,正如问题所暗示的那样。
list
ArrayList
都是,不是吗?JLS第4.8节说:“仅允许使用原始类型作为对遗留代码兼容性的让步。强烈反对在Java编程语言中引入泛型后编写的代码中使用原始类型。Java编程语言的未来版本可能不允许使用原始类型。”@Edwin,更新了答案,但我仍然建议OP使用
?如果使用
,则扩展此类场景的基本模式?extends Base
在泛型类型中,允许从结构中取出内容,但不允许将内容放入其中。您对
employeeList
的引用永远不允许添加新的
Employee
,因为它使用通配符引用。不过,它可以安全地以
BaseEmployee
的身份读取它已经包含的任何内容。使用通配符IMHO.List example=new ArrayList(),无法实现问题建议的功能;get(0.myFunction();AND List example=new ArrayList();get(0.myFunction();我使用了这些代码,但错误:找不到符号:方法myFunction();它应该是
listclasseapple{int-price;public void myFunction(int-iPrice){price=iPrice;}}class orange{int-price;public void myFunction(int-iPrice){price=iPrice;}}}public class main{public static void main(String[]args){List List=new ArrayList();//创建3个苹果对象到list.add(新苹果());list.add(新苹果());list.add(新橙色());list.get(0)。//*“get(0)。“这不是使用苹果对象和我的函数*/}而不是
list.get(0).myFunction(…)
try
((苹果)(list.get(0))).myFunction(1)检查我粘贴在这里的代码:为了查看这是否是您正在尝试做的。。。
anything.add(new Employee(..))
Employee mike = (Employee) anything.get(0);
List anything = new ArrayList()
List<Employee> list = new ArrayList<>();