我有一个ArrayList作为一个Object(来自反射)并创建了我自己的类,它扩展了它(ArrayListMonitor),每当一个arraylist删除/添加一个项目时调用一个函数。但后来我明白了:java.util.ArrayList无法强制转换为ArrayListMonitor 我需要监视arraylist,因为我正在加载一个jar并从中创建一个服务器,它有一个我需要监视的客户端字段。
答案 0 :(得分:3)
如果ArrayList
不是实例ArrayListMonitor
,则无效:
ArrayList<String> a = new ArrayList<String>();
ArrayListMonitor<String> am = (ArrayListMonitor<String>) a; // must throw ClassCastException
如果要监视阵列列表,可以选择以下几种方法:
new ArrayListMonitor(a);
之类的委托,并为ArrayList
答案 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的内容转换为监视器列表。您无法像这样向其他人的对象添加功能。你需要它们来使用你的特殊数组类。除非您尝试使用的代码有一些机制让您说“使用我的课程”,否则这种方法将无效。
为了能够监视预先存在的编译对象,技术上可以操作编译的字节代码,但这是一种非常复杂的技术。