Nano Hash - криптовалюты, майнинг, программирование

Использование ArrayList абстрактного класса

У меня есть абстрактный класс C0. У меня есть несколько других классов, которые наследуются от C0. Они переопределяют абстрактные методы и имеют собственные специальные методы.

Я хочу создать ArrayList, содержащий каждый из этих специализированных классов.

Вот кусок кода, показывающий, как я (хочу) это сделать:

ArrayList<C0> A = new ArrayList<>();
A.add(new C1() );
A.add(new C2() );

A.get(x).method_of_C0(); // Works because my classes extend C0.
A.get(0).method_of_C1(); // Does not work
A.get(1).method_of_C2(); // Does not work

Я хотел бы иметь возможность вызывать собственные методы C1 и C2 через этот ArrayList. Возможно ли это? Я пробовал некоторые настройки вручную, но безуспешно.


  • =› взгляните на полиморфизм 22.07.2014
  • Сложный путь - посмотреть, есть ли способ через Reflection 22.07.2014

Ответы:


1

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

A.get(x).method_of_C0();
((C1)A.get(0)).method_of_C1();
((C2)A.get(1)).method_of_C2();

Вы также можете использовать ключевое слово instanceof, чтобы проверить, что элемент на самом деле является экземпляром определенного подтипа, прежде чем выполнять приведение, иначе вы получите исключение ClassCastException.

Но обратите внимание, что это имеет довольно неприятный запах кода, поэтому отслеживание каждого подтипа по мере необходимости — это, вероятно, правильный путь.

22.07.2014

2

Проблема здесь в том, что вы не объявляете тип объекта при создании нового экземпляра ArrayList.
Вот самый простой способ решить вашу проблему:

ArrayList<C0> A = new ArrayList<C0>();
A.add( new C1() );
A.add( new C2() );

Теперь следующие строки кода должны работать. Пока C1 и C2 являются подклассами C0.

A.get(0).method_C1();
A.get(1).method_C2(); 
09.12.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..