编写接受具有特定方法的对象的方法的语法

时间:2011-11-02 18:55:51

标签: generics scala

我想写一个通用的辅助方法:

def using(closeable: [B has close() method], callback: [B has close() method] => A): A {
  try {
    callback(closeable)
  } finally {
    closeable.close()
  }
}

意图是我可以使用具有close()方法的任何东西:

using(new FileInputStream(...)) {
  stream => stream.read()
}

using(dataSource.getConnection) {
  conn => using(conn.createStatement()) {
    statement => using(statement.executeQuery("...")) {
      rs => rs.getString(1)
    }
  }
}

我正在寻找的是如何命名,以便我可以自己搜索语法,以及语法本身。

3 个答案:

答案 0 :(得分:8)

完整地提供

type Closeable = {def close() }
def using[A,B](a: A with Closeable)(f: A => B) =
 try { f(a) } finally { a.close() }

(您也可以写A {def close()}而不是A with Closeable

测试:

case class X(i: Int) { def close() = println("closed") }
using(X(3)){x => println("i is " + x.i) }

输出:

  

我是3

     

关闭

答案 1 :(得分:5)

这称为结构类型

答案 2 :(得分:4)

Debilski是对的,其语法为closable: { def close() }

编辑:这是您想要根据对象使用的替代Scala implementation of the .NET like using construct的链接,它是应用方法。