Предположим, у меня есть класс A, который имеет некоторые методы. Тогда у меня есть класс B, который расширяет A, но имеет дополнительную переменную. Теперь я хочу иметь ArrayList как A, так и B в другом классе, так что, когда я перебираю список, например, .getName()
, я получаю имя обоих классов? Создать файл ArrayList<A>
и добавить к нему экземпляры A и B или создать ArrayList<Object>
? В случае ArrayList<Objects>
, как я могу называть .getName()
на разных объектах?ArrayList SuperClass, содержащий унаследованные классы
ответ
Вы должны создать ArrayList с параметром типа, установленным в A. B наследует все свойства и методы A, что означает, что вы можете получить к ним доступ в B точно так же, как вы обращаетесь к ним в A. Если, однако, вы хотите получить доступ к свойству в B, которого нет в A, вам нужно будет его бросить. Например,
for (A p: aList) {
p.methodFromA();
if (p instanceof B) {
B q = (B) p;
q.methodOnlyBHas();
// or
((B)p).methodOnlyBHas();
}
}
Если вы создали ArrayList объектов вы должны бросить каждый элемент класса, который вы хотите. Это в значительной степени отрицает идею создания дженериков и ничем не отличается от создания ArrayList без параметра типа. Вам следует избегать этого, чтобы вы могли получить преимущества, которые генерируют вам генерические средства, например, вводить ошибки во время компиляции, а не исключать исключения во время выполнения.
Но что, если я хочу распечатать объект, т. Е. Что A получил som переменные, называемые «имя, размер, цвет» и «В», совпадают, но также имеют переменную «вес», как мне получить все переменные из A и все от B? Например: 'Для (A p: aList) { print (p) }', но я также хочу напечатать объект типа B в 'ArrayList '? Если это имеет смысл ... – Lasse
Я обновил ответ, чтобы добавить код, надеюсь, что поможет – ewanc
Awesome! Благодаря! :) – Lasse
ArrayList<A>
будет работать как для A, так и для B, не нужно идти для большего обобщения, т. Е. Объекта.
Как позвонить в getName()
зависит от того, где getName()
. Если он находится в A
, вы можете вызвать его во всех объектах в ArrayList
, но если метод находится только в B
, вам, возможно, придется проверить instanceof B
, а затем вызвать метод.
- 1. Android reflection - Найти унаследованные классы
- 2. C# унаследованные классы
- 3. Javadoc и унаследованные классы
- 4. Унаследованные классы шаблонов
- 5. классы, унаследованные в UVM
- 6. Deserializing унаследованные классы
- 7. Как назвать унаследованные классы?
- 8. Унаследованные классы, возвращающие разные значения
- 9. EntityFramework, унаследованные классы без дискриминатора
- 10. Какие унаследованные классы в Java?
- 11. ArrayList, содержащий произвольные объекты
- 12. sphinx autodoc пропускает классы, унаследованные от mock
- 13. Сериализовать унаследованные классы, используя protobuf-net
- 14. Получить все унаследованные классы общего абстрактного класса
- 15. std_vector.i не накладывает правильно унаследованные классы
- 16. C++ Унаследованные классы шаблонов и списки инициализации
- 17. Как инициализировать все унаследованные классы в python3.2?
- 18. Рассмотрите все унаследованные классы при использовании typeof
- 19. Принудительно унаследованные классы для определения определенных методов
- 20. Унаследованные классы в очереди приоритетов C++ 11
- 21. Переключатель SuperClass
- 22. Добавление примечания PostLoad к SuperClass в Morphia
- 23. Классы Java и ArrayList
- 24. Java ArrayList и классы
- 25. Parcelable, содержащий ArrayList самого себя
- 26. SuperClass И подклассы
- 27. Superclass несовпадение
- 28. Java-классы и разъяснение ArrayList
- 29. Java ArrayList как добавить классы
- 30. Как добавить классы в ArrayList?
Если я правильно понимаю ваше намерение, вы должны использовать 'ArrayList ', поскольку B является подклассом A. Если оба класса имеют метод getName() (B наследует метод от A, но вы также можете переопределить его), вам просто понадобится цикл для итерации через ваш 'ArrayList' и вызов метода getName() для каждого объекта в' ArrayList'. –