2013-12-05 2 views
0

Как получить доступ к полю объекта в ArrayList, когда объект расширяет тип, который я написал в генераторах ArrayList?Java - ArrayList - Как получить доступ к объекту field

Heres код:

ArrayList<ObjectA> objA = new ArrayList()<>; 
objA.add(new ObjectA()); 
objA.add(new ObjectAB()); // ObjectAB extends ObjectA 

теперь я хотел бы изменить variablein ObjectAB, сохраненную в списке

(только ObjectAB имеет это поле, не Objecta)

+0

Что вы подразумеваете под 'only ObjectAB это поле, а не ObjectA'? – Masudul

+1

@Masud Он добавил еще несколько полей расширенного класса ObjectAB; и он пытается получить к ним доступ. Ссылка на обращение типа ObjectA не может отображать вновь добавленные поля в дочернем классе. – Lokesh

ответ

5

Если я вас правильно понял, вы хотите сделать что-то вроде этого:

ArrayList<ObjectA> objA = new ArrayList()<>; 
objA.add(new ObjectA()); 
objA.add(new ObjectAB()); // ObjectAB extends ObjectA 

ObjectAB ab = (ObjectAB) objA.get(1); 
ab.setFieldFromAB("foo"); 

Таким образом, вы должны бросить элемент из списка objA к типу ObjectAB. Если вы не уверены, что у вас будет успех, вы можете сначала сделать некоторые проверки, например

if(objA.get(1) instanceof ObjectAB) { 
    ObjectAB ab = (ObjectAB) objA.get(1); 
    ab.setFieldFromAB("foo"); 
} else { 
    //doSomethingElse 
} 
+0

работает просто отлично .. спасибо! – user2347921

1

При получении назад объекты из ArrayList, вы получите объекты типа ObjectA. Потому что ArrayList<T> - это список объектов типа T.

ObjectA obj0 = objA.get(0); 
ObjectA obj1 = objA.get(1); // This you cannot get as the reference of ObjectAB 

Вы должны явно подавленным obj1 к ObjectAB

ObjectAB obj1B = (ObjectAB) obj1; 

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

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