Допустим, у меня есть класс 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