Я работаю над абстрактным CRUD-DAO для моего проекта play2/slick2. Чтобы иметь удобные первичные идентификаторы, безопасные для типов, я использую Unicorn в качестве дополнительной абстракции и удобства поверх сликов MappedTo
и ColumnBaseType
.
Unicorn предоставляет базовый класс CRUD-DAO BaseIdRepository
, который я хочу расширить для конкретных нужд проекта. Подпись класса
class BaseIdRepository[I <: BaseId, A <: WithId[I], T <: IdTable[I, A]]
(tableName: String, val query: TableQuery[T])
(implicit val mapping: BaseColumnType[I])
extends BaseIdQueries[I, A, T]
Это приводит к тому, что реализации DAO выглядят примерно так:
class UserDao extends
BaseIdRepository[UserId, User, Users]("USERS", TableQuery[Users])
Мне это кажется ужасно излишним. Я смог поставить tableName
и query
из T
, предоставив мне следующую подпись на моем собственном Abstract DAO.
abstract class AbstractIdDao[I <: BaseId, A <: WithId[I], T <: IdTable[I, A]]
extends BaseIdRepository[I,A,T](TableQuery[T].baseTableRow.tableName, TableQuery[T])
Возможно ли в Scala каким-то образом вывести типы I
и A
, чтобы сделать возможной подпись, подобную следующей? (Users
— это класс, расширяющий IdTable
)
class UserDao extends AbstractIdDao[Users]
Возможно ли это без времени выполнения? Если только с помощью отражения во время выполнения: как использовать манифест в определении класса и насколько велико влияние производительности в реактивном приложении?
Кроме того, поскольку я новичок в языке и работаю самостоятельно: это вообще хорошая практика в scala?
Спасибо за помощь. Не стесняйтесь критиковать мой вопрос и английский язык. Улучшения, конечно же, будут отправлены в git-repo Unicorn.
EDIT: На самом деле, TableQuery[T].baseTableRow.tableName, TableQuery[T]
не работает из-за ошибки требуется тип класса, но T найден, IDEA внешне устраивала, а scalac — нет.
TableQuery[T].baseTableRow.tableName
. Ошибка возникает внутри макроса, вероятно, поэтому IntelliJ не может ее обнаружить. - person Régis Jean-Gilles   schedule 25.04.2014