Метод Scala, определенный для двух равных абстрактных типов - PullRequest
2 голосов
/ 21 марта 2012

Я пытаюсь выяснить, как мне написать метод, подобный 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 Ответ

7 голосов
/ 21 марта 2012

Решение состоит в том, чтобы использовать 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)
  }
}

Или использовать внутренние типы, как объяснено в комментарии Дебилски:

class Example {
  def baz[A](f: Foo {type T = A}, b: Bar {type T = A}) {
    b.receive(f.send)
  }
}

, и если вам грустно, потому чтовы предпочитаете использовать внутренние типы, наберитесь терпения, над этим работает Мартин Одерский (и команда Scala): http://groups.google.com/group/scala-language/browse_thread/thread/3d5e2ae8ed6a221f/ff2536f0f0296ec8?#ff2536f0f0296ec8

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...