2010-07-01 4 views
1

Je suis un peu boiteux avec les génériques, mais je me demande, pour la classe suivante:Est-il possible d'obtenir la classe de l'argument générique?

static class SomeClass<T> { 
private T value; 

public SomeClass(T value) { 
    T.class? 
    this.value = value; 
} 

public T getValue() { 
    return value; 
} 
} 

Appelée par exemple: SomeClass<String> stringer = new SomeClass<String>("Hello"); Est-il possible d'obtenir String.class (ou quoi que T serait) dans la constructeur?

Ok, attendez une seconde, je vais vous expliquer ce que je suis en train de résoudre

Le problème réel est que je suis en utilisant OrmLite et j'ai beaucoup d'objets DAO, comme celui-ci:

public class PostDAO extends BaseJdbcDao<Post, String> { 
    public PostDAO(DatabaseType databaseType) { 
     super(databaseType, Post.class); 
    } 
} 

Pour Domain il est:

public class DomainDAO extends BaseJdbcDao<Domain, String> { 
public DomainDAO(DatabaseType databaseType) { 
    super(databaseType, Domain.class); 
} 
} 

et ainsi de suite. Je voulais paramètrer ceux-ci, de sorte que je ne peux en avoir un:

public class DAO<K, V> extends BaseJdbcDao<K, V> { 
public DAO(DatabaseType databaseType) { 
    super(databaseType, (WHAT HERE?)); 
} 
} 

mais je suis bloqué sur la partie what here)

+0

Pourquoi voulez-vous obtenir la classe? – pakore

+0

vous ne pouvez pas faire 'new SomeClass (" Bonjour ");' sur une classe 'static' btw. – pakore

+0

@pakore: Peut-être que vous ne pouvez pas, mais je peux. ;) Sérieusement: Cela fonctionne bien pour moi et pourquoi pas? – musiKk

Répondre

1

Qu'en est-:

public class DAO<K, V> extends BaseJdbcDao<K, V> { 
public DAO(DatabaseType databaseType, Class databaseClass) { 
    super(databaseType, databaseClass); 
} 
} 
-1

value.getClass() devrait faire l'affaire (valeur en supposant est jamais nulle !)

+0

Et si je n'ai pas de valeur? – htf

+0

Alors vous ne pouvez pas. Cette information est seulement disponible au moment de la compilation. Au moment de l'exécution, il y a juste 'Object'. – musiKk

+0

Je pense que BaseJdbcDao a l'argument de classe en paramètre parce que vous ne pouvez pas obtenir la classe du paramètre type. Comme Dao n'est pas une classe concrète elle-même, vous pouvez y ajouter le paramètre de classe. – tkr

1

@ réponse de pakoré est un bon mais je voulais ajouter que vous ne ont à définir l'objet DAO par classe. Je l'ai recommandé dans la documentation ORMLite mais c'est supposé être pratique, pas douloureux.

Vous pouvez toujours faire quelque chose comme ce qui suit en utilisant BaseJdbcDao comme une classe anonyme:

BaseJdbcDao<Post, String> postDao = 
    new BaseJdbcDao<Post, String>(databaseType, Post.class) { 
    }; 
postDao.setDataSource(dataSource); 
postDao.initialize(); 

-je faire beaucoup dans les tests JUnit ORMLite. Peut-être préférable d'avoir une méthode utilitaire comme celle-ci. Je viens de l'ajouter à la classe BaseJdbcDao qui sera dans la version 2.7.

public static <T, ID> Dao<T, ID> createDao(DatabaseType databaseType, 
    DataSource dataSource, Class<T> clazz) throws SQLException { 
    BaseJdbcDao<T, ID> dao = new BaseJdbcDao<T, ID>(databaseType, clazz) { 
    }; 
    dao.setDataSource(dataSource); 
    dao.initialize(); 
    return dao; 
} 
Questions connexes