【问题标题】:Scala problems with slick 2, when case class and object name are same当案例类和对象名称相同时,slick 2 的 Scala 问题
【发布时间】:2014-09-29 06:14:49
【问题描述】:

其实我有一些关于类名的问题,这是我的问题

我有一个这样的案例类,

case class Foo(
  val compositeKey: String, // clientId-now-requestId
  val requestPath: String,
  val requestStatus: String) {

  def this() = this("", "", "")
  def someData = this.compositeKey.split("-")(0)
  def someData2 = this.compositeKey.split("-")(2)
}

还有 Slick 的 Projection 类,

class Foos(tag: Tag) extends Table[Foo](tag, "Foo") {

  def compositeKey: Column[String] = column[String]("composite_key", O.PrimaryKey)
  def requestPath: Column[String] = column[String]("request_path")
  def requestStatus: Column[String] = column[String]("request_status")
  def * : ProvenShape[ClientApiLog] = (compositeKey, requestPath, requestStatus) <> (Foo.tupled, Foo.unapply) //Error is thrown in this line
}

不幸的是,案例类名 == 对象

object Foo {
.
.
.
}

这是一个旧代码,案例类和对象已在许多地方使用,因此我无法更改案例类或对象的名称,并且由于它们具有相同的名称,我在创建投影类,我在这一行遇到错误:

def * : ProvenShape[Foo] = (compositeKey, requestPath, requestStatus) <> (Foo.tupled, Foo.unapply)

- Implicit conversions found: (compositeKey, requestPath, requestStatus) => anyToToShapedValue((compositeKey, requestPath, 
 requestStatus))
- value tupled is not a member of object models.Foo
- implements scala.slick.lifted.AbstractTable.$times

当我更改案例类名称并在投影类中使用它时,它可以正常工作,我遇到了这个问题,因为案例类和对象具有相同的名称。这个问题有解决办法吗,不改case类/对象名能解决吗??

【问题讨论】:

  • 如果两者都导入到同一个文件中,您可以尝试添加类的完整路径:(package.path.to.Foo.tupled, package.path.to.Foo.unapply)
  • 即使我输入完整路径也是一样的,因为对象和案例类具有相同的名称,并且对象优先于案例类。问题是case class和object和projection class在同一个文件中,不能改变case class和object的位置。
  • 对不起,我以为它们是在不同的文件中定义的,所以它们有不同的包名,我的错。您可能可以尝试的另一件事是更改导入中的对象名称,例如this question shows,这应该足以避免冲突。
  • 是的,我按照你的建议做了,但不幸的是,对象优先于案例类。

标签: mysql scala slick-2.0


【解决方案1】:

你可以这样试试

(Foo.apply _).tupled

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 2012-05-15
    相关资源
    最近更新 更多