Я новичок в java, так что извиняюсь, если у меня есть совершенно неправильный конец палки.Java и generics
Я пытаюсь написать общий (в английском смысле слова!) Класс доступа к данным. например, я в настоящее время:
public class DA<T> {
public static Dao getAccountDao() throws NamingException, SQLException {
Context ctx = new InitialContext();
DataSource dataSource = (DataSource)ctx.lookup("java:comp/env/jdbc/test");
ConnectionSource connectionSource = new DataSourceConnectionSource(dataSource, new MysqlDatabaseType());
Dao<Account, Integer> accountDao = DaoManager.createDao(connectionSource, Account.class);
return accountDao;
}
}
И я могу назвать это с:
Dao<Account, Integer> accountDao = DA.getAccountDao();
Но я нужна версия этого для каждого Dao/модели. Поэтому я пытаюсь сделать что-то, что можно назвать следующим:
Dao<SomeClass, Integer> someClassDao = DA.getDao(SomeClass);
Возможно ли это?
Я пытался что-то вроде:
public class DA {
public static Dao getDao(<T>) throws NamingException, SQLException {
Context ctx = new InitialContext();
DataSource dataSource = (DataSource)ctx.lookup("java:comp/env/jdbc/test");
ConnectionSource connectionSource = new DataSourceConnectionSource(dataSource, new MysqlDatabaseType());
Dao<T, Integer> accountDao = DaoManager.createDao(connectionSource, T.class);
return accountDao;
}
}
но Netbeans дает ошибку: illegal start of type
Мой мозг борется с обобщениями, это то, что они могут сделать ?!
EDIT: С помощью постов ниже я должен:
public class DA<T> {
public static Dao<T, Integer> getDao(T daoType) throws NamingException, SQLException {
Dao<T, Integer> accountDao = DaoManager.createDao(T.class);
return accountDao;
}
}
, который генерирует две ошибки: non-static type variable T cannot be referenced from a static context
и если я удалить static
ключевое слово, я получаю: cannot select from a type variable
Мне нужно узнать о том, как общие и статические работы работают вместе, но второй выглядит как следствие стирания (http://www.coderanch.com/t/386358/java/java/Converting-type-parameters-class), поэтому не уверен, что это происходит возможно.
Следует упомянуть ранее, что материал Dao использует библиотеку ORM под названием ORMLite, поэтому createDao и т. Д. Не мой код.
мне нужно для достижения тех же целей твоего и шел по тому же маршруту как и ты. но библиотека ORMLite, которую вы используете, предлагает другой способ сделать это. Этот комментарий не отвечает на ваш вопрос, но, вероятно, поможет вам лучше достичь своей общей цели. См. Этот вопрос [SO для более подробной информации] (http://stackoverflow.com/questions/8273675/how-to-extend-the-basedaoimpl-class-of-ormlite-on-android-to-extend-functionalit). Надеюсь, поможет. –