考虑我需要使用的库的设计,无法修复:
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方法,我不能:(帮助赞赏。
答案 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的答案没有。