Scala:实现Java接口导致类型不兼容

时间:2013-06-13 14:32:42

标签: java scala types interface

我有一个我想在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
  }

出于某种原因,我得到了错误 “trait xyz中的覆盖方法existsTable  of type(tableId:String)Boolean;方法existsTable具有不兼容的类型“

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

问候。

PS:当我没有实现一个接口的时候,我确实让这个方法工作过一次,所以方法本身应该没有错误。这只是Scala中Java接口的实现让我很难过。

2 个答案:

答案 0 :(得分:3)

如评论中所示,这不起作用的原因是Scala的布尔值与Java的布尔值不同。解决此问题的一种快速方法是:

import java.lang.{Boolean => JBoolean}

override def existsTable(tableId: String): JBoolean

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

override def existsTable(tableId: String): java.lang.Boolean

答案 1 :(得分:2)

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

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