Можно ли получить класс общего аргумента? - PullRequest
1 голос
/ 01 июля 2010

Я немного отстал от дженериков, но мне интересно, для следующего класса:

static class SomeClass<T> {
 private T value;

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

 public T getValue() {
  return value;
 }
}

Если вызывается, например: SomeClass<String> stringer = new SomeClass<String>("Hello"); Можно ли получить String.class (или что-то еще Tбудет) в конструкторе?

Хорошо, подождите секунду, я собираюсь объяснить, что я пытаюсь решить

Фактическая проблема заключается в том, что я использую OrmLite , и у меня есть много объектов DAO, таких как этот:

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

Для Domain это:

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

и так далее.Я хотел их параметризовать, чтобы у меня был только один:

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

, но я застрял на what here части)

Ответы [ 3 ]

1 голос
/ 01 июля 2010

А как же:

public class DAO<K, V> extends BaseJdbcDao<K, V> {
 public DAO(DatabaseType databaseType, Class databaseClass) {
  super(databaseType, databaseClass);
 }
}
1 голос
/ 08 июля 2010

@ pakore - хороший ответ, но я хочу добавить, что у вас нет для определения объекта DAO для каждого класса. Я рекомендовал это в документации ORMLite, но это должно быть удобством, а не болью.

Вы всегда можете сделать что-то вроде следующего, используя BaseJdbcDao в качестве анонимного класса:

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

Я часто это делаю в тестах ORMLite junit. Может быть лучше иметь вспомогательный метод, подобный следующему. Я только что добавил его в класс BaseJdbcDao, который будет в версии 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;
}
0 голосов
/ 01 июля 2010

value.getClass () должен добиться цели (при условии, что значение никогда не равно нулю!)

...