我正在试图弄清楚我应该如何编写像Example.baz这样的方法:
class Foo {
type T
def send : T
}
class Bar {
type U
def receive(u: U)
}
class Example {
def baz(f: Foo, b: Bar) {
b.receive(f.send)
}
}
显然,这只在T = U的情况下才有意义,这就是我的意图。我只是不确定如何通知编译器这个意图。我觉得我正在消除一些非常明显的语言特征。
答案 0 :(得分:7)
解决方案是使用Generic而不是内部类型:
trait Foo[T] {
def send : T
}
trait Bar[T] {
def receive(t: T)
}
class Example {
def baz[T](f: Foo[T], b: Bar[T]) {
b.receive(f.send)
}
}
或使用内部类型,如Debilski评论中所述:
class Example {
def baz[A](f: Foo {type T = A}, b: Bar {type T = A}) {
b.receive(f.send)
}
}
如果你因为喜欢使用内部类型而感到难过,请耐心等待,Martin Odersky(以及scala团队)正在研究它:http://groups.google.com/group/scala-language/browse_thread/thread/3d5e2ae8ed6a221f/ff2536f0f0296ec8?#ff2536f0f0296ec8