Re: Can this callback mechanism be generified?
Couple of notes, nothing terribly important...
Casper Bang wrote:
Mark Space wrote:
I agree this part is easier to read, I just don't see the rest of the
code much improved (pulling the type by name from the interface name
was a pretty good trick. With luck, we'll get reifiable types in Java
7 and then nonsense like that will be unneeded.)
I did some reading (Java Generics and Collections) and it turns out
there are ways to get to the types, in spite of erasure. So now I do it
a bit cleaner, no pulling apart a string and no reflection required:
You expect this to return Class<T>, don't you? So why don't you declare
it that way.
private <T> Class extractGenericType(Callback<T> callback)
{
Type[] interfaces = callback.getClass().getGenericInterfaces();
if(interfaces.length != 1 || !(interfaces[0] instanceof
ParameterizedType))
Don't assume it should be exactly one, it would probably be better to go
through a loop.
throw new RuntimeException("You must supply a generified
Callback with a single parameterized type");
It would be more appropriate to throw an IllegalArgumentException I
think. It would probably be even more appropriate to throw a
CallbackException of your own creation.
Type[] parmTypes =
((ParameterizedType)interfaces[0]).getActualTypeArguments();
return (Class)parmTypes[0];
}
Hope this is useful.
--
Daniel Pitts' Tech Blog: <http://virtualinfinity.net/wordpress/>