Типовые границы сложно. В частности, 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() }] ...
P.S. Если вы действительно планируете использовать это много, вы, вероятно, должны также играть с
class D extends B { override def f = 6 }
class E extends A { override def f() = 6 }
и посмотрите, какой use
вам нужно использовать в каждом конкретном случае.