如何在不使用泛型的情况下限制ArrayList的元素

时间:2012-06-12 20:00:52

标签: java generics arraylist

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

6 个答案:

答案 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()之类的东西是运行时限制。当出现错误类型的对象时,它会在运行时抛出错误。但是如果你没有泛型,它在编译时对你没有帮助。

所以这两件事是正交的,也不是另一件事的替代品。你究竟想要什么?