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

Scala:实现Java接口会导致类型不兼容,java,scala,types,interface,Java,Scala,Types,Interface,我有一个Java接口,我想在Scala中实现它。该接口包含以下方法声明: public Boolean existsTable(String tableId); 我的Scala实现是: override def existsTable(tableId: String): Boolean = { val dbmeta = connection.getMetaData() val dbtables = dbmeta.getTables(null, null, channel

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

  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
  }
由于某种原因,我得到了这个错误 “重写方法在特性xyz中存在。” 类型(tableId:String)为布尔值;方法existsTable的类型不兼容“

但我真的不知道哪里会有不兼容的类型,因为它只是一个布尔值,返回类型

你好


PS:在我没有实现接口的时候,我曾经让这个方法以精确的方式工作过一次,所以这个方法本身应该没有错误。正是Scala中Java接口的实现给了我一段艰难的时间。

问题是Scala的
布尔值
对应于Java的
布尔值
,而不是Java的
布尔值
。如果将Java返回类型更改为
boolean
,但将Scala返回类型保留为
boolean
,那么它应该可以工作


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

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

import java.lang.{Boolean => JBoolean}

override def existsTable(tableId: String): JBoolean
通过对类型进行别名处理,可以更清楚地了解返回的内容。当然,您可以将其定义为:

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

注意:
public
接口方法声明上的修饰符是多余的;另外,为什么不
返回dbtables.next()
?(为什么
Boolean
而不是
Boolean
呢?)但是我把它改为只返回dbtablex.next(),所以请点击thx。不幸的是,它仍然在抱怨不兼容的类型……您需要java的Boolean:
覆盖def existsTable(tableId:String):java.lang.Boolean
。哦,这很有效。谢谢这和评论中建议的答案都强制使用Java
Boolean
类型,该类型与Scala的互操作性较差,并强制始终使用装箱(在这种情况下,这看起来是不必要的)。将Java接口更改为使用
boolean
会更好。