【问题标题】:Scala: Compilation error: Cannot resolve overloaded methodScala:编译错误:无法解析重载方法
【发布时间】:2020-04-30 04:29:27
【问题描述】:

我已将带有 the following method 的 Play/Scala 项目导入 Intellij,但由于我不明白的原因而出现编译错误。有什么想法吗?

我正在使用 Java 8 和 Scala 2.11.6。

  def fetchUser(id: Long): Option[UserRecord] =
    Cache.getAs[UserRecord](id.toString).map { user =>
      Some(user)
    } getOrElse {
      DB.withConnection { connection =>
        val sql = DSL.using(connection, SQLDialect.POSTGRES_9_4)
        val user = Option(sql.selectFrom[UserRecord](USER).where(USER.ID.equal(id)).fetchOne())
        user.foreach { u =>
          Cache.set(u.getId.toString, u)
        }
        user
      }
    }

编译错误在于调用withConnection 方法。错误是:Cannot resolve overloaded method 'withConnection'

当我尝试跳转到withConnection 方法的实现时,编译器在play.api.db.DB (2.4.3) 类中建议了两种可能的方法:

  /**
   * Execute a block of code, providing a JDBC connection. The connection is
   * automatically released.
   *
   * @param name The datasource name.
   * @param autocommit when `true`, sets this connection to auto-commit
   * @param block Code block to execute.
   */
  def withConnection[A](name: String = "default", autocommit: Boolean = true)(block: Connection => A)(implicit app: Application): A =
    db.database(name).withConnection(autocommit)(block)

  /**
   * Execute a block of code, providing a JDBC connection. The connection and all created statements are
   * automatically released.
   *
   * @param block Code block to execute.
   */
  def withConnection[A](block: Connection => A)(implicit app: Application): A =
    db.database("default").withConnection(block)

【问题讨论】:

  • 你有没有修改源?如果没有,请考虑在 GitHub 存储库上将此问题报告为问题。我会首先检查一切是否兼容。您提到了 scala 2.11.6sbt 指定了 2.11.7 github.com/manuelbernhardt/reactive-web-applications/commit/…
  • 编译器抱怨,因为它无法确定调用哪个方法。你可以试试DB.withConnection(name="default", autocommit="true") {...},以防它是默认参数搞砸了。也可能是它无法解析隐含的Application
  • 两个版本的Scala都没有解决这个问题。我改成2.11.6是因为其他章节的项目2.11.7有问题。当事情按预期工作时,当withConnection 在我发布的原始代码中,编译器会选择哪种方法,带有2个或3个参数列表的方法?我尝试按照您的建议添加带有两个参数的参数列表(我认为您可以简单地使用显式空列表代替),但我仍然遇到这个问题。
  • P.S.如果您查看 Github 存储库中 CH08 项目中的等效控制器/Application.scala 文件,则该代码中有一个非常相似的方法调用。当我将 CH08 项目导入 Intellij 时,IDE 不会在方法调用上显示编译错误。 (我必须在 CH08 降级 SBT 版本才能进行编译,所以我在 CH07 也做了同样的事情)。在 CH08 中,编译器可以毫无问题地选择其中一种方法(我认为在这种情况下它会选择只有 2 个参数列表的方法)。
  • 这可能是 IDE 无法识别代码更改的奇怪情况(也称为错误)之一。我在 Intellij 和 Eclipse 中遇到过很多次这样的事件,不仅主要是在我导入新项目时,或者在我更改工作项目的某些依赖项的版本时。 Stackoverflow 充满了这样的问题和对某些人有效但对其他人无效的巫毒解决方案。我确实尝试过“使缓存无效并重新启动”,但没有任何变化。

标签: scala intellij-idea java-8 playframework compiler-errors


【解决方案1】:

编译器应该会找到

def withConnection[A](block: Connection => A)(implicit app: Application): A =
    db.database("default").withConnection(block)

因为匹配调用

DB.withConnection { ... }

相同
DB.withConnection( block = { ... })

只要能找到隐含的Application。我不知道这个隐含的Application 存在于哪里,但由于这是从一个示例项目到一本书,我认为它存在于某个地方并且过去曾工作过。

您发布了三个与此项目有关的构建错误的问题。请不要在每次遇到此项目的构建错误时发布新问题。那不是SO的重点。这些问题最好针对项目本身的维护者,即。作者在 GitHub repo 的问题页面上。

现在看起来这个项目没有得到维护。这是一个老项目。由于版本过时,您很可能会遇到问题。考虑问一个关于构建旧游戏项目的问题。

【讨论】:

  • @rapt 虽然我同意你的不同意见,但我想指出你的额外反驳是不必要的,而且完全没有帮助。 Ad Hominem 攻击绝对不是 StackOverflow 的主题,这个人花了一些时间试图帮助你。诚然,在论坛上发帖肯定不会让你得到你想要的东西,以及一些……有趣的……意见,但是任何输入都应该被视为一种服务,或者只是被忽视。如果您想抱怨,请保持建设性并引用一些消息来源。供你们阅读的一个很好的链接可能是:stackoverflow.com/help/how-to-askCheers!
猜你喜欢
  • 1970-01-01
  • 2020-08-15
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 2012-11-20
相关资源
最近更新 更多