0

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?

  • 1
    You 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 Answers2

0

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();
   }
}
rgettman
  • 176,041
  • 30
  • 275
  • 357
0
ArrayList<A> myArray;

This array list will hold objects of type A and type B.

AgilePro
  • 5,588
  • 4
  • 33
  • 56