首页 文章

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

提问于
浏览
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
  }

由于某种原因,我得到错误“覆盖方法existsTable在trait xyz类型(tableId:String)布尔值;方法existsTable具有不兼容的类型”

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

问候 .

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

2 回答

  • 2

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

    import java.lang.{Boolean => JBoolean}
    
    override def existsTable(tableId: String): JBoolean
    

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

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

    问题是Scala的 Boolean 对应于Java的 boolean ,而不是Java的 Boolean . 如果将Java返回类型更改为 boolean 但将Scala保留为 Boolean 则应该可以 .

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

相关问题