2010-07-01 5 views
1

Я вроде хромой с обобщениями, но мне интересно, для следующего класса:Можно ли получить класс общего аргумента?

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 части)

+0

Почему вы хотите получить класс? – pakore

+0

вы не можете сделать 'new SomeClass (« Hello »);' на 'static' class btw. – pakore

+0

@pakore: Может быть, вы не можете, но я могу. ;) Серьезно: он отлично работает для меня и почему бы и нет? – musiKk

ответ

1

насчет:

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

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

+0

что делать, если у меня нет значения? – htf

+0

Тогда вы не можете. Эта информация доступна только во время компиляции. Во время выполнения есть только «Object». – musiKk

+0

Я думаю, что BaseJdbcDao имеет параметр класса как параметр, потому что вы не можете получить класс из параметра типа. Поскольку Dao не является конкретным классом, вы также можете добавить параметр класса. – tkr

1

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

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

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

я, что много в JUnit тестов ORMLite. Может быть, лучше иметь полезный метод, например, следующий. Я только что добавил его к классу 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; 
} 
Смежные вопросы