将Java泛型转换为Scala

将Java泛型转换为Scala,java,scala,Java,Scala,对于Scala项目的单元测试,我正在编写自己的简单的javax.sql.DataSource类,它基本上只是将java.sql.DriverManager实例包装在封面下 我只是简单地扩展了javax.sql.DataSource,并让Eclipse为所需的方法/函数自动生成存根 class H2DataSource extends javax.sql.DataSource { import java.io.PrintWriter import java.sql.DriverManag

对于Scala项目的单元测试,我正在编写自己的简单的
javax.sql.DataSource
类,它基本上只是将
java.sql.DriverManager
实例包装在封面下

我只是简单地扩展了
javax.sql.DataSource
,并让Eclipse为所需的方法/函数自动生成存根

class H2DataSource extends javax.sql.DataSource {

  import java.io.PrintWriter
  import java.sql.DriverManager

  var printWriter : PrintWriter

  Class.forName("org.h2.Driver")

  @throws(classOf[SQLException])
  override def getLogWriter() : PrintWriter = {
    printWriter
  }

  @throws(classOf[SQLException])
  override def getLoginTimeout() : Int = {
    // TODO Auto-generated method stub
    0
  }

  @throws(classOf[SQLException])
  override def setLogWriter(printWriter: PrintWriter) = {
    this.printWriter = printWriter 
  }

  @throws(classOf[SQLException])
  override def setLoginTimeout(seconds: Int) = {
    // TODO Auto-generated method stub
  }

  @throws(classOf[SQLException])
  override def isWrapperFor(iface: Class[_]) : Boolean = {
    // TODO Auto-generated method stub
    false
  }

  @throws(classOf[SQLException])
  override def unwrap[T](iface: java.lang.Class[_]) : T = {
    // TODO Auto-generated method stub
    null.asInstanceOf[T]
  }

  @throws(classOf[SQLException])
  override def getConnection() : Connection = {
    DriverManager.getConnection("jdbc:h2:myH2")
  }

  @throws(classOf[SQLException])
  override def getConnection(user: String, password: String) : Connection = {
    DriverManager.getConnection("jdbc:h2:myH2", user, password)
  }

}
但是,我在使用
unwrap
函数时遇到了编译问题。。。编译器告诉我它不会重写任何东西

下面是
展开
的并排比较。。。第一个是用Java自动生成的,第二个是我自己翻译成Scala的。有人能发现我做错了什么,以至于编译器无法识别它们是等价的吗

@Overrride
public <T> T unwrap(Class<T> iface) throws SQLException {
   return null;
}

...

@throws(classOf[SQLException])
override def unwrap[T](iface: java.lang.Class[_]) : T = {
  null.asInstanceOf[T]
}
@override
公共T展开(iface类)引发SQLException{
返回null;
}
...
@抛出(类[SQLException])
覆盖def unwrap[T](iface:java.lang.Class[)):T={
null.asInstanceOf[T]
}
试试:


差别是显而易见的。在java版本中,展开的返回类型与iface的类型相关,但您的scala版本中,展开的返回类型与iface的类型无关。谢谢!(至少第二句)哦,糟了。在我的实验过程中的某个时刻,我把
Class[T]
改成了
Class[\u]
,只是在思想上转了个弯,我没有把它改回去。
@throws(classOf[SQLException])
override def unwrap[T](iface: Class[T]) : T = {
  null.asInstanceOf[T]
}