對於單元測試Scala項目,我編寫了自己的簡單javax.sql.DataSource
類,它基本上只包含了一個java.sql.DriverManager
實例。將Java泛型轉換爲Scala
我簡單地擴展了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
功能......與編譯器告訴我,它不會覆蓋任何東西。
這是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]
}
差別是顯而易見的。在java版本中,解包的返回類型與iface的類型相關,但是您的scala版本解包的返回類型與iface的類型無關。 – xiefei
謝謝! (對於第二句話,至少) –