2

我有一个想要在 Scala 中实现的 Java 接口。该接口包含以下方法声明:

  public Boolean existsTable(String tableId);

我的 Scala 实现是:

  override def existsTable(tableId: String): Boolean = {
    val dbmeta = connection.getMetaData()
    val dbtables = dbmeta.getTables(null, null, channelId, null)
    if (dbtables.next())
      // table exists
      return true
    else
      return false
  }

出于某种原因,我收到错误“在 (tableId: String)Boolean 类型的特征 xyz 中覆盖方法 existsTable;方法 existsTable 的类型不兼容”

但我真的不知道哪里可能存在不兼容的类型,因为它只是一个返回类型的布尔值?

问候。

PS:当我没有实现接口时,我曾经以确切的方式使用过这个方法,所以方法本身应该没有错误。只是 Scala 中 Java 接口的实现让我很难过。

4

2 回答 2

3

正如评论中指出的那样,这不起作用的原因是 Scala 的 Boolean 与 Java 的 Boolean 不同。解决此问题的快速方法是:

import java.lang.{Boolean => JBoolean}

override def existsTable(tableId: String): JBoolean

通过对类型进行别名,您要返回的内容更加清晰。您当然可以将其定义为:

override def existsTable(tableId: String): java.lang.Boolean
于 2013-06-13T15:03:13.183 回答
2

问题是 ScalaBoolean对应于 Java 的boolean,而不是 Java 的Boolean. 如果您将 Java 返回类型更改为boolean但保留 Scala 一个,因为Boolean它应该可以工作。

Scala 将所有原始类型提升到真实对象的级别,让编译器根据它们的使用方式决定根据需要对它们进行装箱/拆箱。另一方面,Java 维护原始类型的两种表示:原始类型本身(小写字母)和装箱表示(大写字母)。

于 2013-06-13T15:03:02.980 回答