2012-06-28 3 views
1

스칼라 프로젝트를 테스트하는 유닛의 경우, 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) 
    } 

} 

그러나, 나는 아무것도를 오버라이드 (override)하지 않는 것을 말해 컴파일러와 함께 ... 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 버전에서 unwrap의 반환 유형은 iface 유형과 관련이 있지만 스칼라 버전에서는 unwrap의 반환 유형이 iface 유형과 아무 관련이 없습니다. – xiefei

+0

고마워요! (그 두 번째 문장은 적어도) –

답변

3

시도 :

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

오, 이런. 나는 실험 중 어떤 시점에서'Class [T]'를'Class [_]'로 바꿨고 정신적으로 뒤돌아 보지 않았다. –

관련 문제