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