I've an interface ITransportable that force the classes who implements it to have two methods, one for produce a object based on "this", and one to load "this" from a object. In fact I'm using "transports" object to hide the underlying classes to the user, so every class that is "transportable", in this example "ItemDetalle" have a corresponding transport class. The GenericTransport class implements some generics methods I use to make the code more readable and all transports classes derive from it.
public interface ITransportable<T> {
public T getTransport();
public <U extends ITransportable<T>> U loadFromTransport(T transport);
}
public class GenericTransport {
[...]
public static <T extends ITransportable<U>,U extends GenericTransport> T loadFromTransport(U transport) {
try {
Method loadFromTransport=transport.getClass().getMethod("loadFromTransport");
T result = (T) loadFromTransport.invoke(transport);
return result;
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
Logger.getLogger(GenericTransport.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
public static <T,U extends GenericTransport> LinkedList<T> loadFromTransport(List<U> list) {
if (list==null) return null;
LinkedList<T> ll=new LinkedList<>();
for (U element : list) ll.add((T) GenericTransport.loadFromTransport(element));
return ll;
}
}
here there are two "twin" classes, ItemDetalle class and ItemDetalleTransport
public ItemDetalleTransport extends GenericTransport {
[...]
}
public class ItemDetalle implements ITransportable<ItemDetalleTransport> {
public ItemDetalleTransport getTransport() {
[...]
}
public void loadFromTransport(ItemDetalleTransport t) {
[...]
}
}
and there is a class that I use for experimenting:
public class otherClass {
protected LinkedList<ItemDetalle> det
public void setDet(LinkedList<ItemDetalle> det) {
this.det=det;
}
[...]
public void test1(ItemDetalleTransport t) {
ItemDetalle det = GenericTransport.loadFromTransport(t);
}
public void test2(LinkedList<ItemDetalleTransport> t) {
LinkedList<ItemDetalle> localDet = GenericTransport.loadFromTransport(t);
this.setDet(localDet);
}
public void test3(LinkedList<ItemDetalleTransport> t) {
this.det = GenericTransport.loadFromTransport(t);
}
public void test4(LinkedList<ItemDetalleTransport> t) {
this.setDet(GenericTransport.loadFromTransport(t));
}
[...]
}
function "test4" does not work, claiming that a LinkedList of Objects cannot be converted to a LinkedList of ItemDetalle. I understand it's not a very big problem, but I'm curious, someone can explain why?
Thank you!