- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为我的 play2/slick2 项目开发一个抽象的 CRUD-DAO。为了获得方便的类型安全主 ID,我正在使用 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]
class UserDao extends
BaseIdRepository[UserId, User, Users]("USERS", TableQuery[Users])
tableName
和
query
来自
T
, 在我自己的抽象 DAO 上给我以下签名
abstract class AbstractIdDao[I <: BaseId, A <: WithId[I], T <: IdTable[I, A]]
extends BaseIdRepository[I,A,T](TableQuery[T].baseTableRow.tableName, TableQuery[T])
I
和
A
使签名如下可能? (
Users
是一个扩展
IdTable
的类)
class UserDao extends AbstractIdDao[Users]
TableQuery[T].baseTableRow.tableName, TableQuery[T]
由于所需的错误类类型而不起作用,但 T 发现,IDEA 表面上很好,scalac 不是。
最佳答案
至于你的第一个问题,我在使用 Slick 时也遇到过这个问题。但是如果你仔细想想,你会发现在编译时你不能这样做。这是因为此类型信息是必要的,用于指定类型参数之间的关系。如果不这样做,您将能够构造 BaseIdRepository
的类。类型没有意义的地方,例如 IdTables
表格不代表投影。由于您需要每个关系的名称,因此您需要 3 个命名类型参数。如果省略第一个,则可以构造一个没有包含 Id 的投影的 IdRepository;如果省略第二个,则可能有一个没有 ID 列的表;如果省略第三个,则可以查询不具有表和带有 ID 的投影的这种组合的表。您可能没有在您的应用程序中定义的类型目前会破坏任何这些规则,但编译器不知道这一点。提供正确的类型信息是不可避免的。
至于你的第二个问题,仅仅因为你认为语法冗长而使用反射是非常不可取的。如果您可以通过简单地提供类型参数来保证类型安全,我建议您这样做。以这种方式编写 Scala 是非常糟糕的品味和风格。将类型安全 ID 与 Unicorn 一起使用,然后通过反射绕过其类型安全,这将是具有讽刺意味的。
此外,还有一个 Manifest
不是您想要的: list 不允许您向编译器提供较少的类型信息,它只会让您更灵活地指定在哪里这样做。它允许您在编译时利用编译器的类型知识来规避类型删除引入的一些问题。你在这里面临的问题与类型删除无关,所以 Manifest
s 不会工作。最后,运行时反射在这里对您没有多大帮助,因为如果您尚未提供类型信息,Slick 的内部函数将不允许您进行编译。
所以是的,你想要的是不可能的。 Scala(和 Slick)在编译时需要完整的信息,没有任何技巧可以有效地规避这一点。
关于scala - 推断抽象类中的多个泛型类型,这些类型应该可供编译器使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22763848/
Windows Phone 8 上的开发人员可以使用两个命名空间 - Microsoft.Devices.Sensors 和 Windows.Devices.Sensors。它们几乎完全相同。有人能解
如何使 NameValueCollection 可供 LINQ 查询运算符(例如 where、join、groupby)访问? 我尝试了以下方法: private NameValueCollectio
我希望能够测试哪些文本转语音可供我的 iOS 应用程序与 AVSpeechSynthesis 一起使用。生成已安装声音的列表很容易,但 Apple 将其中一些声音禁止应用程序使用,我想知道哪些声音。
我让 postgres.app 在我的 Mac 上本地运行,并希望我的本地 docker 容器能够连接到它。我该如何最好地做到这一点? 我发现这篇文章建议使用 --add-host 标志(Host p
我有一个包含多个 HTML 文件的文件夹。每个 HTML 文件都使用 AngularJS 并包含相同的声明,如下所示;
与仍然生活在 ant 构建环境世界(在 Windows 机器上)的客户合作。想要在 Java 程序中使用 google-cloud-translate 库,但如果我包含 google-cloud-tr
我是一名优秀的程序员,十分优秀!