结构类型有上限?

时间:2011-12-12 16:11:55

标签: scala types

考虑我需要使用的库的设计,无法修复:

trait Foo

class IgnoreMe extends Foo
class A extends Foo { def bar: A = ...}
class B extends Foo { def bar: B = ...}

在我的代码中:

object Stuff {
  type Barred = { def bar: Foo }

  def doStuff(b:Barred) = b.bar
}

这一切都很好,除了Stuff.doStuff会接受任何符合Barred类型的东西,而不仅仅是我想要的Foo的子类型。

我想定义Barred这样它既是Foo的子类型又有一个bar方法,我不能:(帮助赞赏。

3 个答案:

答案 0 :(得分:9)

简单

type Barred = Foo {def bar: Foo }

答案 1 :(得分:1)

你试过了吗?

def doStuff(b: Barred with Foo) = b.bar

在运行时没有反射的情况下实现所需的另一种方法(但如果将Foo的新bar方法的新子类型添加到库中,则需要更多工作),即可定义{ {1}}类别类trait Barred[T]implicit的{​​{1}}个实例,并使用类型绑定:

Barred[A]

答案 2 :(得分:1)

根据您的示例,这可能更合适:

type Barred[T <: Barred[T]] = Foo { def bar: T }

这允许您定义,例如

def double_bar[T <: Barred[T]](x: T) = x.bar.bar

@ didierd的答案没有。