Допустим, у меня есть класс A, в котором есть несколько методов. Затем у меня есть класс B, который расширяет A, но имеет дополнительную переменную. Теперь я хочу иметь ArrayList как A, так и B в другом классе, чтобы, когда я перебираю список, например, с помощью метода .getName(), я получал имя обоих классов? Создать ArrayList<A> и добавить к нему экземпляры A и B, или создать ArrayList<Object>? В случае ArrayList<Objects>, как мне вызвать .getName() для разных объектов?
ArrayList SuperClass, содержащий унаследованные классы
- Если я правильно понимаю ваше намерение, вы должны иметь возможность использовать
ArrayList<A>, поскольку B является подклассом A. Если оба класса имеют методgetName()(B унаследует метод от A, но вы также можете переопределить его), вам просто нужен цикл для повторения вашегоArrayListи вызова методаgetName()для каждого объекта вArrayList. 02.12.2015
Ответы:
Вы должны создать 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 без параметра типа. Вам следует избегать этого, чтобы вы могли получить преимущества, которые дают вам дженерики, например, ошибки ввода во время компиляции, а не приведение исключений во время выполнения.
ArrayList<A> будет работать как для A, так и для B, нет необходимости в большем обобщении, т.е. Object.
Способ вызова getName() зависит от того, где определено getName(). Если он находится в A, вы можете вызвать его во всех объектах в ArrayList, но если метод находится только в B, вам, возможно, придется проверить instanceof B, а затем вызвать метод.
name, size, color, а у B есть то же самое, но также есть переменная `weight, how do I get all of the variables from A and all from B? Like:For(A p: aList){ print(p) }`, но я также хочу напечатать объект типа B вArrayList<A>? Если есть смысл.. 02.12.2015