Переопределите ArrayList и приведите один к этому классу - PullRequest
1 голос
/ 19 августа 2011

У меня есть ArrayList как объект (из отражения) и я создал собственный класс, который выходит за его пределы (ArrayListMonitor), который вызывает функцию каждый раз, когда в массиве элементов удален / добавлен элемент.Но затем я получаю следующее: java.util.ArrayList не может быть приведен к ArrayListMonitor. Мне нужно отслеживать arraylist, так как я загружаю флягу и создаю из нее сервер, который имеет поле клиентов, которое мне нужно отслеживать.

Ответы [ 3 ]

3 голосов
/ 19 августа 2011

Если ArrayList не является экземпляром ArrayListMonitor, это не может работать:

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

Если вы хотите отслеживать список массивов, у вас есть несколько вариантов:

  1. напишите делегат наподобие new ArrayListMonitor(a); и создайте делегаты для всех соответствующих методов в ArrayList
  2. Использование динамического прокси для отслеживания поведения ArrayList
  3. использовать другие методы, такие как AOP
1 голос
/ 19 августа 2011

Правильно, вы не можете привести любой ArrayList к вашему подклассу ArrayList.

По аналогии:

Каждый слон - это млекопитающее, но не каждое млекопитающее - это слон.
Каждый ArrayListMonitor является ArrayList, но не каждый ArrayList является ArrayListMonitor.

См. Раздел Inheritance в руководстве по Java для получения более подробной информации.


А что касается вашего комментария, взгляните на этот сценарий:

OutputStream os1 = new FileOutputStream("foo.txt");
OutputStream os2 = new DataOutputStream(os1);
DataOutputStream dos2 = (DataOutputStream) os2; // works
DataOutputStream dos1 = (DataOutputStream) os1; // will throw ClassCastException
0 голосов
/ 19 августа 2011

Объект, который вы пытаетесь разыграть, какой это фактический тип?

 ArrayList anArrayList = new ArrayList();

или

 ArrayList aMonitorList = new ArrayListMonitor();

Вы не сможете разыграть что-либо подобное anArrayListваш список мониторов.Вы не можете добавить функциональность к чужим объектам, подобным этому.Вам нужно, чтобы они использовали ваш специальный класс массива.Если код, который вы пытаетесь применить, не имеет какого-либо механизма, позволяющего вам сказать «использовать мой класс», этот подход не будет работать.

Чтобы иметь возможность отслеживать уже существующие скомпилированные объекты, технически возможноманипулировать скомпилированным байтовым кодом, но это довольно сложная техника.

...