2012-06-28 5 views
1

Pour tester un projet Scala à l'unité, j'écris ma propre classe simple javax.sql.DataSource qui enveloppe simplement une instance java.sql.DriverManager sous les couvertures.Traduction de génériques Java vers Scala

J'ai simplement étendu javax.sql.DataSource, et pour la plupart, laissez Eclipse générer automatiquement des stubs pour les méthodes/fonctions requises.

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) 
    } 

} 

Cependant, je suis en cours d'exécution dans un problème de compilation avec la fonction unwrap ... avec le compilateur me disant qu'il ne l'emporte pas sur quoi que ce soit.

Voici une comparaison côte-à-côte de unwrap ... la première générée automatiquement en Java, et la seconde traduite en Scala par moi-même. Quelqu'un peut-il repérer ce que je fais mal, de sorte que le compilateur ne les reconnaîtrait pas comme équivalents?

@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

La différence est évidente. En version java le type de retour de unwrap est lié au type d'iface mais votre version de scala le type de retour de unwrap n'a rien à voir avec le type d'iface. – xiefei

+0

Merci! (pour cette deuxième phrase, au moins) –

Répondre

3

Essayez:

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

Oh, duh. J'avais changé 'Class [T]' 'Class [_]' à un moment donné pendant mon expérimentation, et je me suis tellement retourné mentalement que je ne l'ai pas changé. –