Scala方法定义在两个相同的抽象类型上

时间:2012-03-21 08:24:13

标签: scala polymorphism

我正在试图弄清楚我应该如何编写像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的情况下才有意义,这就是我的意图。我只是不确定如何通知编译器这个意图。我觉得我正在消除一些非常明显的语言特征。

1 个答案:

答案 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