I have a Parent Class Item and multiple child classes itemA, itemB etc.
Now I want to have a method which takes 2 ArrayLists of the same classtype (for example itemA,itemA) and map the items based on a method in the parent class( so my idea was to make a method which takes in 2 Arraylists of the parent class so it accepts Arraylists of the child classes which were cast to the parent class.
Heres how the method should look like:
HashMap<Item,Item> mapping(ArrayList<Item> prop1, ArrayList<Item> prop2)
{
//Content of the method not that important
}
And I should be able to call the method with the Arraylists of the child classes like
Arraylist<ItemA> list1 = ...;
ArrayList<ItemA> list2 = ...;
mapping(list1, list2);
But Apparently you cannot cast between Arraylists that easily. My only idea was to write 3 seperate methods for the 3 classes itemA, itemB, itemC. Does anyone have a better idea?
CodePudding user response:
<T extends Item> HashMap<T,T> mapping(ArrayList<T> prop1, ArrayList<T> prop2)
{
//Content of the method not that important
}
CodePudding user response:
You need something like this:
<T extends Item> HashMap<T, T> mapping(ArrayList<T> prop1,
ArrayList<T> prop2) {
// ...
}
then
Arraylist<ItemA> list1 = ...;
ArrayList<ItemA> list2 = ...;
HashMap<ItemA, ItemA> map = mapping(list1, list2);
Note that the type system will ensure that the same type (ItemA, ItemB, whatever) is used for both the arguments and the result.
Apparently you cannot cast between Arraylists that easily.
Correct. There is no subtype relationship between ArrayList<Item> and ArrayList<ItemA> etcetera
My only idea was to write 3 separate methods for the 3 classes itemA, itemB, itemC.
The 3 methods would have to have different names or be in different classes. You will find that Java won't let you declare
HashMap<Item,Item> mapping(ArrayList<Item> prop1,
ArrayList<Item> prop2)
and
HashMap<ItemA,ItemA> mapping(ArrayList<ItemA> prop1,
ArrayList<ItemA> prop2)
in the same class / interface. Method signatures must be distinguishable after type erasure!
