Thanks a lot for those detailed examples ! I don't want to setup a factory, but to expose internals as optional features :
my class is a composite, with a map of "features", where the key is the feature interface ( Map<Class, Object>) I'd like to get an optional feature using : Optional opt = composite.getFeature( Optional.class ); The generics way seems to be : Optional opt = composite.<Optional> getFeature(); How can I then get the Class object used as generics type, to get it from the map ? public <T> T getFeature() { return aggregators.get( T.class ); // Doesn't work } 2007/9/27, Engelking, Nicholas <[EMAIL PROTECTED]>: > > Specifically, you could use > > public <T> T getInstance(Class<T> clazz) > throws InstantiationException, IllegalAccessException{ > return clazz.newInstance(); > } > > The Class<T> object has a method newInstance() that creates an instance of a > class with the default constructor. The exceptions it throws represent cases > where you don't have visibility permissions for the constructor, there is no > default constructor, the class is abstract, or the constructor call throws an > error (which is then wrapped and rethrown). The method outlined above is just > a wrapper - if you already have the class object you can just instantiate it. > If you need to not use the default constructor, try something like: > > public <T> T getInstance(Class<T> clazz) > throws IllegalArgumentException, > SecurityException, > InstantiationException, > IllegalAccessException, > InvocationTargetException, > NoSuchMethodException { > return clazz > .getConstructor( > Parameter1Type.class, > Parameter2Type.class) > .newInstance( > parameter1, > parameter2); > } > > The getConstructor methods takes all they types for it's parameters in > declaration order. This is to resolve the method signature. In this class > your class would have a constructor: > > MyClass(Parameter1Type parameter1, Parameter2Type parameter2){ > // constructor stuff here > } > > The newInstance method takes the actual parameters to pass to the > constructor. In this example, they are parameter1 (which is a Parameter1Type) > and parameter2 (which is a Parameter2Type). The errors occur if the > constructor doesn't exist, the arguments are the wrong type, the caller > doesn't have visibility permissions, the class is abstract, or the > constructor throws an error (which is then wrapped and rethrown). > > You could also pass the parameters into the getInstance method and pick out > the constructer dynamically like so: > > public <T> T getInstance(Class<T> clazz, Object... args) > throws InvocationTargetException { > T newObject = null; > for (java.lang.reflect.Constructor<T> c : > clazz.getConstructors()) { > // try creating objects with the passed > // args until one works. > try { > newObject = c.newInstance(args); > break; > } catch (IllegalArgumentException e) { > } catch (InstantiationException e) { > } catch (IllegalAccessException e) { > } > } > return newObject; > } > > This method returns an instance of the class passed created with the > constructor parameters passed. If the constructor throws an error it is > wrapped in an InvocationTargetException and rethrown. If no constructor > matches the method returns null. > > > -----Original Message----- > From: Giovanni Azua [mailto:[EMAIL PROTECTED] > Sent: September 27, 2007 11:56 AM > To: Struts Users Mailing List > Subject: Re: [ot] help on generics... > > how about: > > public static <T> T > getInstance(Class<T> aClass) > { > // TODO: > } > > regards, > Giovanni > > nicolas de loof wrote: > > Hello, > > > > my question is fully off topic, but Struts2 is the only java5 project I > > know. > > > > I'd like a method to return an instance of a class passed as parameter : > > > > public Object getInstance( Class clazz ) > > > > I'd like to use generics to make the return type in sync with the > > class type. Is this possible ??? > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > > ******************** > NOTICE OF CONFIDENTIALITY > This communication including any information transmitted with it is > intended only for the use of the addressees and is confidential. > If you are not an intended recipient or responsible for delivering > the message to an intended recipient, any review, disclosure, > conversion to hard copy, dissemination, reproduction or other use > of any part of this communication is strictly prohibited, as is the > taking or omitting of any action in reliance upon this communication. > If you receive this communication in error or without authorization > please notify us immediately by return e-mail or otherwise and > permanently delete the entire communication from any computer, > disk drive, or other storage medium. > > If the above disclaimer is not properly readable, it can be found at > www.td.com/legal > > AVERTISSEMENT DE CONFIDENTIALITE > Ce courriel, ainsi que tout renseignement ci-inclus, destiné uniquement > aux destinataires susmentionnés, est confidentiel. Si vous > n'êtes pas le destinataire prévu ou un agent responsable de la > livraison de ce courriel, tout examen, divulgation, copie, impression, > reproduction, distribution, ou autre utilisation d'une partie de ce > courriel est strictement interdit de même que toute intervention ou > abstraction à cet égard. Si vous avez reçu ce message par erreur ou > sans autorisation, veuillez en aviser immédiatement l'expéditeur par > retour de courriel ou par un autre moyen et supprimer immédiatement > cette communication entière de tout système électronique. > > Si l'avis de non-responsabilité ci-dessus n'est pas lisible, vous > pouvez le consulter à www.td.com/francais/legale > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]