So basically I've created two classes "public class A" and "public class B extends A". I want to create an ArrayList that contains both objects and be able to access both of their methods. Is this possible and how could I do it?
- 
                    1You have an `Animal` and a `Dog` (which is an animal) class and you want an `arraylist` to hold both of them. What should be type of arraylist ? `Animal` or `Dog` ? This is best I can do without giving you an actual answer. – Prateek Nov 20 '13 at 00:20
- 
                    [This](http://stackoverflow.com/questions/3009745/what-does-the-question-mark-in-java-generics-type-parameter-mean) might answers your question. – MZ4Code Nov 20 '13 at 00:22
2 Answers
An ArrayList<B> won't hold objects of type A, so that can't work.
An ArrayList<? extends A> won't work either.  The compiler won't know which subtype of A (or A itself) it really is, so it won't allow adding anything but null with the add method.
Generally the best you can do is to use an ArrayList<A>.
There could be methods that are defined in A but not B.  Here B simply inherits the A method and can be called using an A reference.
There could be methods that are defined in both A and B.  Here B overrides A's method. Polymorphism indicates that B's method will be called on objects whose runtime type is B.
There could be methods that are defined only in B.  With an A reference they are inaccessible.  But at runtime you can check the type with instanceof:
for (A a : arrayList)
{
   if (a instanceof B)
   {
      B b = (B) a;
      b.methodSpecificToB();
   }
}
 
    
    - 176,041
- 30
- 275
- 357
ArrayList<A> myArray;
This array list will hold objects of type A and type B.
 
    
    - 5,588
- 4
- 33
- 56
