I want to create a custom ArrayList
that can get multiple types like ArrayList<A>
, ArrayList<B>
.
I extended ArrayList like this:
public class ArrayListId<E> extends ArrayList {
public ArrayListId(@NonNull Collection c) {
super(c);
}
public void doSomething(){
//some code
String id = this.get(0).getId();
//some code
}
both A
and B
have the getId
method in common but this.get(index)
returns an Object
which doesn't have this method so I get an error. how can i achieve this without abstracting A
and B
classes?
CodePudding user response:
First of all, there's no need to extend ArrayList
here. You can do this just fine without using inheritance.
To access the getId
-method from A
and B
, they would need to implement a common interface that defines the method. Something like this:
interface CommonInterface {
String getId();
}
class A implements CommonInterface { /* implement getId() */ }
class B implements CommonInterface { /* implement getId() */ }
With this, you can create an ArrayList<CommonInterface>
that can contain both As and Bs.
List<CommonInterface> list = new ArrayList<>();
list.add(new A());
list.add(new B());
You can take this list as an input to a doSomething
-method:
public void doSomething(List<CommonInterface> list) {
//some code
String id = list.get(0).getId();
//some code
}
If you still need to extend ArrayList
(you really shouldn't), then you would need to define it like this:
public class ArrayListId<E extends CommonInterface> extends ArrayList<E> {}