Please consider the following snippet:
public interface MyInterface { public int getId(); } public class MyPojo implements MyInterface { private int id; public MyPojo(int id) { this.id = id; } public int getId() { return id; } } public ArrayList<MyInterface> getMyInterfaces() { ArrayList<MyPojo> myPojos = new ArrayList<MyPojo>(0); myPojos.add(new MyPojo(0)); myPojos.add(new MyPojo(1)); return (ArrayList<MyInterface>) myPojos; }
The return statement does a casting that doesn't compile. How can I convert the myPojos list to the more generic list, without having to go through each item of the list?
Thanks
Try the following: List<TestA> result = new List<TestA>(); List<TestB> data = new List<TestB>(); result. addAll(data);
The Java compiler won't let you cast a generic type across its type parameters because the target type, in general, is neither a subtype nor a supertype.
you can always cast any object to any type by up-casting it to Object first. in your case: (List<Customer>)(Object)list; you must be sure that at runtime the list contains nothing but Customer objects.
Change your method to use a wildcard:
public ArrayList<? extends MyInterface> getMyInterfaces() { ArrayList<MyPojo> myPojos = new ArrayList<MyPojo>(0); myPojos.add(new MyPojo(0)); myPojos.add(new MyPojo(1)); return myPojos; }
This will prevent the caller from trying to add other implementations of the interface to the list. Alternatively, you could just write:
public ArrayList<MyInterface> getMyInterfaces() { // Note the change here ArrayList<MyInterface> myPojos = new ArrayList<MyInterface>(0); myPojos.add(new MyPojo(0)); myPojos.add(new MyPojo(1)); return myPojos; }
As discussed in the comments:
It's usually better to use interfaces instead of concrete types for return types. So the suggested signature would probably be one of:
public List<MyInterface> getMyInterfaces() public Collection<MyInterface> getMyInterfaces() public Iterable<MyInterface> getMyInterfaces()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With