Question

Je suis un peu boiteux avec les génériques, mais je me demande, pour la classe suivante:

static class SomeClass<T> {
 private T value;

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

 public T getValue() {
  return value;
 }
}

Si appelé par exemple: SomeClass<String> stringer = new SomeClass<String>("Hello"); Est-il possible d'obtenir String.class (ou quoi que T serait) dans le 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 j'utilise 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)

Était-ce utile?

La solution

Qu'en est-il:

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

Autres conseils

@ La réponse de pakoré est bonne mais je voulais ajouter que vous ne faites pas Vous pour définir la classe par objet DAO. Je l'ai recommandé dans la documentation ORMLite mais il est censé être une commodité, pas une douleur.

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 fais que beaucoup dans les tests ORMLite JUnit. Peut-être mieux d'avoir une méthode utilitaire comme suit. Je viens d'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;
}

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top