gpt4 book ai didi

scala - 推断抽象类中的多个泛型类型,这些类型应该可供编译器使用

转载 作者:行者123 更新时间:2023-12-04 02:29:35 25 4
gpt4 key购买 nike

我正在为我的 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]

这导致 DAO 实现看起来像
class UserDao extends 
BaseIdRepository[UserId, User, Users]("USERS", TableQuery[Users])

这对我来说似乎非常多余。我能够提供 tableNamequery来自 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])

在 Scala 中是否有可能以某种方式推断类型 IA使签名如下可能? ( Users 是一个扩展 IdTable 的类)
class UserDao extends AbstractIdDao[Users]

如果没有运行时反射,这可能吗?如果仅通过运行时反射:我如何在类定义中使用 list 以及响应式(Reactive)应用程序中的性能影响有多大?

另外,由于我对这门语言还很陌生并且自己工作:这在 Scala 中是一种很好的做法吗?

谢谢你的帮助。随意批评我的问题和英语。改进当然会提交给 Unicorn git-repo

编辑:
其实, 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com