Re: Another generics limitation
Daniel Dyer wrote:
When using generics with multiple bounds, like this:
private <T extends List & Serializable> void method(T t)
{
// Do something.
}
It seems that this method is useless to me without knowing, in advance,
the concrete type of T. What I really want is to be able to cast to a
type intersection. For example:
method((List & Serializable) myObject)
But, of course, this isn't legal. It appears that the only option is to
write a wrapper that implements both interfaces and use that.
Ignoring type safety you can cast to intersection type being the method
type variable, this way:
@SuppressWarnings("unchecked")
private <T extends List & Serializable> void methodFor(List list)
{
method((T)list);
}
And than make a use of type erasure to invoke the method without
specifying concrete type arguments, like this:
private void methodForSerializableList(Object obj)
{
abstract class AnySuitableType implements List, Serializable {};
this.<AnySuitableType>methodFor((List)(Serializable)obj);
}
This is very awful solution and I can not recommend it. But as well as
Java Generics is implemented using the type erasure it should work as
expected. That is it should work fine for:
methodForSerializableList(new ArrayList());
and throw ClassCastException for:
methodForSerializableList(new Object());
methodForSerializableList(new Serializable() {});
...
piotr