2012-06-28 109 views
1

對於單元測試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] 
} 
+0

差別是顯而易見的。在java版本中,解包的返回類型與iface的類型相關,但是您的scala版本解包的返回類型與iface的類型無關。 – xiefei

+0

謝謝! (對於第二句話,至少) –

回答

3

嘗試:

@throws(classOf[SQLException]) 
override def unwrap[T](iface: Class[T]) : T = { 
    null.asInstanceOf[T] 
} 
+0

哦,杜。在我的實驗過程中,我曾經在某個時候將Class [T]'更改爲'Class [_]',並且在精神上轉過身來,我沒有改回它。 –