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]

Reply via email to