我有一个我想在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接口的实现让我很难过。
答案 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维护两种基本类型的表示:基本类型本身(小写字母)和盒装表示(大写字母)。