如何在Scala中定义泛型?

克里斯蒂安·博阿留(Cristian Boariu)

在Slick 2中,我们可以像这样映射表:

case class Cooler(id: Option[Int], minTemp: Option[Double], maxTemp: Option[Double])

/**
 * Define table "cooler".
 */
class Coolers(tag: Tag) extends Table[Cooler](tag, "cooler") {
  def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
  def minTemp = column[Double]("min_temp", O.Nullable)
  def maxTemp = column[Double]("max_temp", O.Nullable)

  def * = (id.?, minTemp.?, maxTemp.?) <> (Cooler.tupled, Cooler.unapply _)
}

object Coolers {
  val tableQuery = TableQuery[Coolers]
}

因为我有很多的表,我想为它们定义通用的方法,如finddeleteupdate所以我必须要定义一个超类这些方法从哪里致以对象(object Coolers extends TableUtils[Coolers, Cooler])。为了定义这些方法,我需要tableQuery移出该超类中的对象,因此我尝试了如下操作:

abstract class TableUtils[T <: Table[A] , A] {

val tableQuery = TableQuery[T]  

}

但我收到tableQuery定义错误

class type required but T found

有人知道我在做什么错吗?

里吉斯让吉尔(Regis Jean-Gilles)

当您执行操作TableQuery[T]时,实际上是在调用TableQuery.apply,它实际上是一个宏

该宏的主体尝试实例化T,但是在您的情况下T已成为编译器不知道如何实例化的(未知)类型参数。问题类似于尝试编译它:

def instantiate[T]: T = new T
// Does not compile ("class type required but T found")

最终结果是TableQuery.apply只能在具体类型上使用。

可以使用类型类来TableQuery.apply解决该问题,方法是使用类型类来捕获对调用的了解(在已知具体类型时),并使用隐式宏来提供此类型类的实例。然后,您将获得类似以下内容的信息:

abstract class TableUtils[T <: Table[A] : TableQueryBuilder, A] {
  val tableQuery = BuildTableQuery[T]
}

whereTableQueryBuilder是类型类,它BuildTableQuery该类的替代版本TableQuery.apply,将转发给TableQueryBuilder实例以执行实际的实例化。

我在此处添加了一个实现,作为另一个答案的一部分

仅声明tableQuery为抽象值并在以下每个具体派生类中对其进行定义将更加容易(如果不太方便)TableUtils

abstract class TableUtils[T <: Table[A] , A] {
  val tableQuery: TableQuery[T, T#TableElementType]
  // define here your helper methods operating on `tableQuery`
}
object Coolers extends TableUtils[Coolers, Cooler] {
  val tableQuery = TableQuery[Coolers]
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Scala中定义泛型?

来自分类Dev

Scala如何在foreach中还原泛型类型

来自分类常见问题

如何在泛型结构中定义const闭包

来自分类Dev

如何在泛型结构中定义const闭包

来自分类Dev

如何在Scala中使用泛型

来自分类Dev

如何在Scala中使用泛型

来自分类Dev

如何在JAVA泛型中定义使用2个泛型参数扩展Map对象的类型?

来自分类Dev

如何在泛型类中返回“ this”?

来自分类Dev

如何在Scala中设置绑定的类型参数以使数字具有泛型功能?

来自分类Dev

如何在Scala中为泛型类型提供默认类型类?

来自分类Dev

如何在Scala中设置绑定的类型参数以使数字具有泛型功能?

来自分类Dev

如何在Scala中编写有界的泛型类

来自分类Dev

如何在Java中为泛型类定义整数变量?

来自分类Dev

如何在继承下的Typescript中定义泛型构造函数?

来自分类Dev

如何在Swift中定义初始化泛型类型

来自分类Dev

Spring RestTemplate:如何在泛型类中定义参数类型

来自分类Dev

Scala中的泛型类型

来自分类Dev

如何从泛型类型定义中获取 typeparam 名称?

来自分类Dev

如何在没有泛型类型参数的情况下定义泛型函数?

来自分类Dev

如何在泛型类中返回对象的泛型类型?

来自分类Dev

如何在泛型方法中获取泛型类型的类实例

来自分类Dev

如何在C#中的泛型类中使用泛型类的对象?

来自分类Dev

Scala泛型-ADT中的泛型提取器方法

来自分类Dev

如何在C#中调用泛型重载方法

来自分类Dev

如何在Ada中明确显示泛型类型的大小?

来自分类Dev

如何在泛型中实现空对象模式?

来自分类Dev

如何在Swift中的泛型类上实现NSCoding?

来自分类Dev

如何在显示的javadoc代码块中获得泛型?

来自分类Dev

如何在golang中为泛型参数编写func

Related 相关文章

  1. 1

    如何在Scala中定义泛型?

  2. 2

    Scala如何在foreach中还原泛型类型

  3. 3

    如何在泛型结构中定义const闭包

  4. 4

    如何在泛型结构中定义const闭包

  5. 5

    如何在Scala中使用泛型

  6. 6

    如何在Scala中使用泛型

  7. 7

    如何在JAVA泛型中定义使用2个泛型参数扩展Map对象的类型?

  8. 8

    如何在泛型类中返回“ this”?

  9. 9

    如何在Scala中设置绑定的类型参数以使数字具有泛型功能?

  10. 10

    如何在Scala中为泛型类型提供默认类型类?

  11. 11

    如何在Scala中设置绑定的类型参数以使数字具有泛型功能?

  12. 12

    如何在Scala中编写有界的泛型类

  13. 13

    如何在Java中为泛型类定义整数变量?

  14. 14

    如何在继承下的Typescript中定义泛型构造函数?

  15. 15

    如何在Swift中定义初始化泛型类型

  16. 16

    Spring RestTemplate:如何在泛型类中定义参数类型

  17. 17

    Scala中的泛型类型

  18. 18

    如何从泛型类型定义中获取 typeparam 名称?

  19. 19

    如何在没有泛型类型参数的情况下定义泛型函数?

  20. 20

    如何在泛型类中返回对象的泛型类型?

  21. 21

    如何在泛型方法中获取泛型类型的类实例

  22. 22

    如何在C#中的泛型类中使用泛型类的对象?

  23. 23

    Scala泛型-ADT中的泛型提取器方法

  24. 24

    如何在C#中调用泛型重载方法

  25. 25

    如何在Ada中明确显示泛型类型的大小?

  26. 26

    如何在泛型中实现空对象模式?

  27. 27

    如何在Swift中的泛型类上实现NSCoding?

  28. 28

    如何在显示的javadoc代码块中获得泛型?

  29. 29

    如何在golang中为泛型参数编写func

热门标签

归档