2015-12-02 2 views
-1

Предположим, у меня есть класс A, который имеет некоторые методы. Тогда у меня есть класс B, который расширяет A, но имеет дополнительную переменную. Теперь я хочу иметь ArrayList как A, так и B в другом классе, так что, когда я перебираю список, например, .getName(), я получаю имя обоих классов? Создать файл ArrayList<A> и добавить к нему экземпляры A и B или создать ArrayList<Object>? В случае ArrayList<Objects>, как я могу называть .getName() на разных объектах?ArrayList SuperClass, содержащий унаследованные классы

ответ

1

Вы должны создать 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 без параметра типа. Вам следует избегать этого, чтобы вы могли получить преимущества, которые генерируют вам генерические средства, например, вводить ошибки во время компиляции, а не исключать исключения во время выполнения.

+0

Но что, если я хочу распечатать объект, т. Е. Что A получил som переменные, называемые «имя, размер, цвет» и «В», совпадают, но также имеют переменную «вес», как мне получить все переменные из A и все от B? Например: 'Для (A p: aList) { print (p) }', но я также хочу напечатать объект типа B в 'ArrayList '? Если это имеет смысл ... – Lasse

+1

Я обновил ответ, чтобы добавить код, надеюсь, что поможет – ewanc

+0

Awesome! Благодаря! :) – Lasse

0

ArrayList<A> будет работать как для A, так и для B, не нужно идти для большего обобщения, т. Е. Объекта.

Как позвонить в getName() зависит от того, где getName(). Если он находится в A, вы можете вызвать его во всех объектах в ArrayList, но если метод находится только в B, вам, возможно, придется проверить instanceof B, а затем вызвать метод.

Смежные вопросы