我正在尝试创建不同类实例的arraylist。如何在不定义类类型的情况下创建列表? (<Employee>)
List<Employee> employees = new ArrayList<Employee>();
employees.add(new Employee());
Employee employee = employees.get(0);
答案 0 :(得分:15)
您可以创建像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
答案 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<>()
填充列表,从而能够从列表中的对象中提取所需的数据明确地投射任何东西。
如果需要对列表进行排序,还可以在界面中放置一个比较器。