2011-01-24 99 views
3

我正在尝试编写一个简单的帮助程序方法,该方法接收可以关闭的内容以及接收前者的某些函数,并确保在执行该函数后关闭“可关闭”。为什么这种结构类型绑定不能按预期工作?

例如,我想用这样的:

closing(new FileOutputStream("/asda"))(_.write("asas")) 

我IMPL是

object Helpers { 

    def closing[T <: { def close }](closeable: T)(action: T => Unit): Unit = 
    try action apply closeable finally closeable close 

} 

但是,试图编译这个简单的测试时:

object Test { 

    import Helpers._ 

    closing(new FileOutputStream("/asda"))(_.write("asas")) 

} 

编译器抱怨:

推断类型参数 [java.io.FileOutputStream中]不 符合方法收盘的类型 参数界限[T <:AnyRef {DEF 接近:单位}]

任何想法,为什么?

回答

11

你需要写

def closing[T <: { def close() }] 

有没有括号空括号和方法方法之间Scala中的一个区别的。

+0

而`FileOutputStream.write`显然不能接受一个字符串。在字符串上调用`getBytes()`。 – Malvolio 2011-01-24 22:49:23

7

类型边界很棘手。特别是,除了参数本身之外,Scala还会跟踪参数列表的数量。试试这些!

class A { def f = 5 } 
class B { def f() = 5 } 
class C { def f()() = 5 } 
def useA[X <: { def f: Int }](x: X) = x.f 
def useB[X <: { def f(): Int }](x: X) = x.f 
def useC[X <: { def f()(): Int}](x: X) = x.f 

useA(new A) // This works, but what other combinations do? 

在你的情况,你想

def closing[T <: { def close() }] ... 

附:如果你使用这个有很多真正的计划,你可能应该也与

class D extends B { override def f = 6 } 
class E extends A { override def f() = 6 } 

玩,看看你需要在每种情况下要使用的use

相关问题