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

Fra*_*eil 3 generics scala

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

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

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

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

using(dataSource.getConnection) {
  conn => using(conn.createStatement()) {
    statement => using(statement.executeQuery("...")) {
      rs => rs.getString(1)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Did*_*ont 8

全力以赴

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

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

一个测试:

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

输出:

我是3岁

关闭


Deb*_*ski 5

这称为结构类型.