假设我有一Employee
堂课。如何在不使用泛型的情况下实现ArrayList
仅包含元素?Employee
也就是说,没有Arraylist<Employee>
,我如何限制ArrayList
只添加Employee
对象?
6 回答
您可以使用Collections.checkedList()
- 但您为什么不想使用泛型?
扩展 ArrayList 并自定义add()
和addAll()
方法来检查正在添加的对象是instanceof
Employee
您可以使用一个包含私有 ArrayList 字段的包装类,例如称为employeeList,有一个
public void add(Employee employee) {
employeeList.add(employee);
}
以及允许外部类以受控方式与 ArrayList 交互的任何其他必要方法。
我发现为此使用组合比继承要好得多。这样,如果您想从 ArrayList 更改为其他内容,例如 LinkedList,甚至是完全不同的内容,您会更轻松。
子类化ArrayList
该类并将其命名为EmployeeArrayList
.
当你“限制”时,你到底想要什么?有两个可能的地方可以设置限制:在编译时或运行时。
泛型是纯粹的编译时事物。它可以帮助您编写正确的代码,但您仍然可以绕过它并将错误的类型放入数组中,并且它不会在运行时抱怨。
另一方面,类似Collections.checkedList()
的是运行时限制。当出现错误类型的对象时,它会在运行时引发错误。但是,如果您没有泛型,它在编译时对您没有帮助。
所以这两件事是正交的,两者都不是另一个的替代品。你到底想要什么?
如果您想避免泛型本身,例如为了与非常旧版本的 Java 兼容,那么扩展或包装 ArrayList 将无济于事 - 您可能希望找到或制作另一个具有相同功能的数组实现。
基本上,ArrayList 只是一个原始数组的包装器,它在必要时将其数据复制并粘贴到更大的数组中,因此从头开始编写并不是特别困难。