Java's runtime discard of class type information seems a bit hassle to
work around,
preventing lot of intuitive usages.
T someMethod( Class<T> clazz, T t) {
map.put(clazz, t);
return map.get(clazz);
}
works with passing in regular non-generic classes, but not
with classes with a type argument.
Another example:
import java.util.Arrays;
import java.util.EventListener;
import javax.swing.event.EventListenerList;
public class Test
{
EventListenerList list = new EventListenerList();
Test()
{
MyListener<Integer> m1 = new MyListener<Integer>();
MyListener<String> m2 = new MyListener<String>();
// this does not work
// list.add(MyListener<Integer>.class, new MyListener<Integer>());
// so use this
list.add(m1.getClass(), new MyListener<Integer>());
list.add(m2.getClass(), new MyListener<Integer>());
// Now how do I get just a list of Listeners that are have
// the Integer type argument?
// i.e.
// MyListener<Integer>[] integerListeners = ??????
}
public static class MyListener<T> implements EventListener
{
}
}
Any comments or suggestions?
Thx
Thomas Hawtin - 18 Apr 2006 10:15 GMT
> Java's runtime discard of class type information seems a bit hassle to
> work around,
[quoted text clipped - 6 lines]
> works with passing in regular non-generic classes, but not
> with classes with a type argument.
> // Now how do I get just a list of Listeners that are have
> // the Integer type argument?
> // i.e.
> // MyListener<Integer>[] integerListeners = ??????
> public static class MyListener<T> implements EventListener
> {
public abstract Class<T> getTypeArgument();
> }
> }
>
> Any comments or suggestions?
Nested generics can be confusing, and if unnecessary should be avoided.
Tom Hawtin

Signature
Unemployed English Java programmer
http://jroller.com/page/tackline/