如何在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条评论
登录后参与评论

相关文章

来自分类常见问题

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

来自分类Dev

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

来自分类Dev

如何在Scala中定义泛型?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何在Scala中使用泛型

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Scala中的泛型类型

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何在Scala中使用泛型

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

    如何在Scala中定义泛型?

  4. 4

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

  5. 5

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

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

    如何在Scala中使用泛型

  12. 12

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

  13. 13

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

  14. 14

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

  15. 15

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

  16. 16

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

  17. 17

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

  18. 18

    Scala中的泛型类型

  19. 19

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

  20. 20

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

  21. 21

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

  22. 22

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

  23. 23

    如何在Scala中使用泛型

  24. 24

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

  25. 25

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

  26. 26

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

  27. 27

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

  28. 28

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

  29. 29

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

热门标签

归档