2

假设我有一Employee堂课。如何在不使用泛型的情况下实现ArrayList仅包含元素?Employee也就是说,没有Arraylist<Employee>,我如何限制ArrayList只添加Employee对象?

4

6 回答 6

8

您可以使用Collections.checkedList()- 但您为什么不想使用泛型?

于 2012-06-12T20:02:35.627 回答
8

扩展 ArrayList 并自定义add()addAll()方法来检查正在添加的对象是instanceof Employee

于 2012-06-12T20:02:01.733 回答
8

您可以使用一个包含私有 ArrayList 字段的包装类,例如称为employeeList,有一个

public void add(Employee employee) {
   employeeList.add(employee);
}

以及允许外部类以受控方式与 ArrayList 交互的任何其他必要方法。

我发现为此使用组合比继承要好得多。这样,如果您想从 ArrayList 更改为其他内容,例如 LinkedList,甚至是完全不同的内容,您会更轻松。

于 2012-06-12T20:02:09.747 回答
0

子类化ArrayList该类并将其命名为EmployeeArrayList.

于 2012-06-12T20:02:31.243 回答
0

当你“限制”时,你到底想要什么?有两个可能的地方可以设置限制:在编译时或运行时。

泛型是纯粹的编译时事物。它可以帮助您编写正确的代码,但您仍然可以绕过它并将错误的类型放入数组中,并且它不会在运行时抱怨。

另一方面,类似Collections.checkedList()的是运行时限制。当出现错误类型的对象时,它会在运行时引发错误。但是,如果您没有泛型,它在编译时对您没有帮助。

所以这两件事是正交的,两者都不是另一个的替代品。你到底想要什么?

于 2012-06-13T04:36:16.603 回答
0

如果您想避免泛型本身,例如为了与非常旧版本的 Java 兼容,那么扩展或包装 ArrayList 将无济于事 - 您可能希望找到或制作另一个具有相同功能的数组实现。

基本上,ArrayList 只是一个原始数组的包装器,它在必要时将其数据复制并粘贴到更大的数组中,因此从头开始编写并不是特别困难。

于 2012-06-12T20:37:56.757 回答