Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 用于编写接受具有特定方法的对象的方法的语法_Generics_Scala - Fatal编程技术网

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

Generics 用于编写接受具有特定方法的对象的方法的语法,generics,scala,Generics,Scala,我想编写一个通用帮助器方法: def using(closeable: [B has close() method], callback: [B has close() method] => A): A { try { callback(closeable) } finally { closeable.close() } } 其目的是我可以将其用于任何具有close()方法的对象: 我要寻找的是它的命名方式,这样我就可以自己搜索语法和语法本身。这被称为结构类型

我想编写一个通用帮助器方法:

def using(closeable: [B has close() method], callback: [B has close() method] => A): A {
  try {
    callback(closeable)
  } finally {
    closeable.close()
  }
}
其目的是我可以将其用于任何具有close()方法的对象:


我要寻找的是它的命名方式,这样我就可以自己搜索语法和语法本身。

这被称为结构类型。

Debilski是对的,它的语法应该是
可关闭:{def close()}

编辑:这里有一个链接,指向基于对象及其应用方法而要使用的备选方案。

以提供完整信息

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岁

封闭的

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