将Java 7 CommonDataSource与Scala一起使用

将Java 7 CommonDataSource与Scala一起使用,scala,jdbc,datasource,java-7,Scala,Jdbc,Datasource,Java 7,在编译Scala代码时,在Java 7 JVM和Scala中使用较旧的(Java 6)JDBC数据源驱动程序似乎存在问题 在Java 7中,Oracle向CommonDataSource接口添加了一个新方法,Logger getParentLogger()。使用Java 6构建的实现了CommonDataSource的旧类不会实现此方法(例如PGConnectionPoolDataSource和SQLServerDataSource)。当使用Scala编译器编译代码时,它会抱怨具体类没有实现抽象

在编译Scala代码时,在Java 7 JVM和Scala中使用较旧的(Java 6)JDBC数据源驱动程序似乎存在问题

在Java 7中,Oracle向
CommonDataSource
接口添加了一个新方法,
Logger getParentLogger()
。使用Java 6构建的实现了
CommonDataSource
的旧类不会实现此方法(例如
PGConnectionPoolDataSource
SQLServerDataSource
)。当使用Scala编译器编译代码时,它会抱怨具体类没有实现抽象方法
getParentLogger

我不知道Java编译器是否会发生这种情况,但我怀疑不会,因为它应该被单元测试捕获

我确信任何添加新方法声明的接口都会出现这个问题


Scala有没有解决这个问题的办法?是恢复到JDK 6的唯一解决方案吗?我没有SQL Server驱动程序的源代码,所以我自己无法解决这个问题(我知道开源没有这个问题,但出于其他原因,我被迫使用该驱动程序)。

在匿名子类中实现缺少的方法

new SQLServerDataSource {
  def getParentLogger: Logger = null
  // other stuff
}
这个小小的奇怪之处实际上是JVM的一个很好的特性,在向接口添加方法时允许某种程度的向后兼容性。我相信您在Java中的行为与在Scala中看到的相同。在这种情况下,Java似乎更能容忍缺少方法定义。我不太清楚为什么,但我猜测这可能与特质的实现方式有关

向接口添加一个方法是一种改变,这是不可能的。这就是为什么您可以直接创建
SQLServerDataSource
的实例。如果您试图在该实例上调用
getParentLogger
,编译器将允许您这样做,但您将在运行时得到
AbstractMethodError


为了实例化匿名内部类,它必须实现所有抽象方法才能成为一个具体的类。由于
SQLServerDataSource
没有提供
getParentLogger
的实现,因此必须在子类中实现该方法。

在匿名子类中实现缺少的方法

new SQLServerDataSource {
  def getParentLogger: Logger = null
  // other stuff
}
这个小小的奇怪之处实际上是JVM的一个很好的特性,在向接口添加方法时允许某种程度的向后兼容性。我相信您在Java中的行为与在Scala中看到的相同。在这种情况下,Java似乎更能容忍缺少方法定义。我不太清楚为什么,但我猜测这可能与特质的实现方式有关

向接口添加一个方法是一种改变,这是不可能的。这就是为什么您可以直接创建
SQLServerDataSource
的实例。如果您试图在该实例上调用
getParentLogger
,编译器将允许您这样做,但您将在运行时得到
AbstractMethodError


为了实例化匿名内部类,它必须实现所有抽象方法才能成为一个具体的类。由于
SQLServerDataSource
没有提供
getParentLogger
的实现,您必须在您的子类中找到它。

什么代码在抱怨?您是在尝试实例化一个
SQLServerDataSource
、扩展它,还是在做其他事情?
newsqlserverdatasource{…}
尝试将其扩展为一个匿名子类(在大括号内设置主机等)。我还试着创建一个实例,然后初始化属性,结果成功了?您是在尝试实例化一个
SQLServerDataSource
、扩展它,还是在做其他事情?
newsqlserverdatasource{…}
尝试将其扩展为一个匿名子类(在大括号内设置主机等)。我还试着创建一个实例,然后初始化属性,结果成功了。为什么在Java中没有具体的方法定义,同样的事情也能成功呢?Java是否更能容忍预编译类中缺少抽象方法?我编辑了我的答案以提供更多细节。这基本上是二进制兼容性和源代码兼容性之间的区别。为什么同样的事情在Java中没有具体的方法定义?Java是否更能容忍预编译类中缺少抽象方法?我编辑了我的答案以提供更多细节。这基本上是二进制兼容性和源代码兼容性之间的区别。
new SQLServerDataSource {
  def getParentLogger: Logger = null
  // other stuff
}