gpt4 book ai didi

scala - 更多 Scala 打字问题

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

现在,Kim Stebel helped me understanding如何使用存在类型键入变量,我需要知道如何在继承中使用它们:

以下代码无法编译:

class PagingListModel(startPageNumber: Int, pageSize: Int, query: Query[Projection[_ <: Product]]) extends AbstractListModel {
val itemStartNumber: Int = startPageNumber * pageSize
val items: List[Product] = getPageData()

override def getPageData(): List[Product] = {
db withSession {
return queryToQueryInvoker(query.drop(itemStartNumber).take(pageSize)).list
}
}
}

......错误:
no type parameters for method queryToQueryInvoker:
(q: org.scalaquery.ql.Query[org.scalaquery.ql.ColumnBase[T]])
org.scalaquery.ql.basic.BasicQueryInvoker[T]
exist so that it can be applied to arguments
(org.scalaquery.ql.Query[org.scalaquery.ql.Projection[_ <: Product]])
--- because ---
argument expression's type is not compatible with formal parameter type;
found : org.scalaquery.ql.Query[org.scalaquery.ql.Projection[_ <: Product]]
required: org.scalaquery.ql.Query[org.scalaquery.ql.ColumnBase[?T]]

……这很奇怪,因为所需的类型确实在找到的类型的范围内……

PS:我真的只想能打电话 foreachgetPageData() 返回的列表中的每个元组上…

最佳答案

我不认为这可以用存在类型来完成。它与类型参数一起使用:

class PagingListModel[T <: Product](... query: Query[Projection[T]]) {
...
def getPageData(): List[_ <: Product] = ...
queryToQueryInvoker(query.drop(itemStartNumber).take(pageSize)).list
}

原始版本是正确的,但由于类似于 Haskell 的单态限制的限制,Scala 无法对其进行类型检查。 queryToQueryInvoker 的类型参数必须是通用类型 [T <: Product] forAll { type T } Scala 不支持。

通过使用显式类型参数,可以使用该特定类型实例化 queryToQueryInvoker。该方法仍然可以返回 List[_ <: Product]因为 List 的元素类型是协变的。

编辑:毕竟这是可能的。你必须将存在物移动到正确的位置:
class PagingListModel(... query: Query[Projection[T]] forSome { type T <: Product })  {
def getPageData(): List[_ <: Product] = ... {
val i = queryToQueryInvoker(query.drop(itemStartNumber).take(pageSize))
i.list
}
}

没有额外的变量 i编译器会推断出错误的类型,然后提示它。对我来说看起来像一个错误。

关于scala - 更多 Scala 打字问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6141701/

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