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]