在Scala中将类限制为特征和结构子类型

Ral*_*lph 4 scala subtype

我需要限制Scala方法参数,以便它实现特征和结构子类型.我怎样才能做到这一点?

trait Foo
// ...
def someMethod[A <: Foo xxx { def close() }](resource: A)(block: A => Unit) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

我该代替xxx什么?我都尝试extendswith,但有语法错误.

可以使用type结构子类型的定义来完成吗?

ten*_*shi 7

是的,您可以使用type此:

type CanBeClosed = {def close()}

def someMethod[A <: Foo with CanBeClosed](resource: A)(block: A => Unit) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

最近我也写了类似主题的帖子:

http://hacking-scala.posterous.com/composing-your-types-on-fly


agi*_*eel 6

我实际上不确定,如果这与tenshi建议的相同,但它编译,所以试试看......

def someMethod[A <: Foo { def close() }](resource: A)(block: A => Unit) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)