Since you can NOT do
class S<T>{S(){T t = new T();}} // broken
how would you create an object of type T somewhere in S? Think about this
before you read on ...
At the risk of reigniting the world-famous generics debates of yesteryear, just as our noble core-developers regroup to start work on making 1.5 even better than what is already the best Java web framework, I thought I'd share the idea I suggested to one of our developers who was having a bad day with generics (for several good reasons [1][2]) a couple of months ago, in case you can make use of it somewhere, or, find an even more convoluted solution - notice the innocent looking abstract modifier!
// not real code
// don't try this at home without adult supervision!
public abstract class FunnyFactory<T> {
private T instance = null;
public T getInstance() {
if (instance == null) {
try {
final ParameterizedType gsc =
(ParameterizedType)getClass().getGenericSuperclass();
final Class<T> typeT =
(Class<T>) gsc.getActualTypeArguments()[0];
instance = typeT.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return instance;
}
}
...
public class CreateInstanceOfTypeParameter {
@Test
public void testCreateInstanceOfTypeParameter() {
FunnyFactory<Point> factory = new FunnyFactory<Point>() {};
factory .getInstance().x = 22;
factory .getInstance().y = 47;
assertEquals(new Point(22, 47), factory.getInstance());
}
}
Regards - Cemal
jWeekend
OO & Java Technologies, Wicket Training and Development
http://jWeekend.com
[1] http://gafter.blogspot.com/2006/11/reified-generics-for-java.html
[2] http://weblogs.java.net/blog/arnold/archive/2005/06/generics_consid_1.html
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]