覆盖ArrayList并将其转换为该类

时间:2011-08-19 08:29:26

标签: java arraylist extends

我有一个ArrayList作为一个Object(来自反射)并创建了我自己的类,它扩展了它(ArrayListMonitor),每当一个arraylist删除/添加一个项目时调用一个函数。但后来我明白了:java.util.ArrayList无法强制转换为ArrayListMonitor 我需要监视arraylist,因为我正在加载一个jar并从中创建一个服务器,它有一个我需要监视的客户端字段。

3 个答案:

答案 0 :(得分:3)

如果ArrayList不是实例ArrayListMonitor,则无效:

ArrayList<String> a = new ArrayList<String>();
ArrayListMonitor<String> am = (ArrayListMonitor<String>) a; // must throw ClassCastException

如果要监视阵列列表,可以选择以下几种方法:

  1. 编写new ArrayListMonitor(a);之类的委托,并为ArrayList
  2. 中的所有相关方法创建委托
  3. 使用dynamic proxy监控ArrayList的行为
  4. 使用其他技术,如AOP

答案 1 :(得分:1)

没错,您不能将任何ArrayList强制转换为ArrayList子类。

作为类比:

每只大象都是哺乳动物,但不是每只大象都是大象 每个ArrayListMonitor都是一个ArrayList,但不是每个ArrayList都是一个ArrayListMonitor。

有关详细信息,请参阅Java教程的Inheritance部分。


关于你的评论,请看一下这个场景:

OutputStream os1 = new FileOutputStream("foo.txt");
OutputStream os2 = new DataOutputStream(os1);
DataOutputStream dos2 = (DataOutputStream) os2; // works
DataOutputStream dos1 = (DataOutputStream) os1; // will throw ClassCastException

答案 2 :(得分:0)

您正在尝试投射的对象,它的实际类型是什么?

 ArrayList anArrayList = new ArrayList();

 ArrayList aMonitorList = new ArrayListMonitor();

您将无法将任何类似anArrayList的内容转换为监视器列表。您无法像这样向其他人的对象添加功能。你需要它们来使用你的特殊数组类。除非您尝试使用的代码有一些机制让您说“使用我的课程”,否则这种方法将无效。

为了能够监视预先存在的编译对象,技术上可以操作编译的字节代码,但这是一种非常复杂的技术。