структурный тип с верхней границей? - PullRequest
4 голосов
/ 12 декабря 2011

рассмотрите этот дизайн библиотеки, которую я должен использовать и не могу исправить:

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 ]

9 голосов
/ 12 декабря 2011

Просто

type Barred = Foo {def bar: Foo }
1 голос
/ 12 декабря 2011

Учитывая ваши примеры, это может быть более подходящим:

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

Это позволяет вам определить, например,

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

а ответ @ didierd - нет.

1 голос
/ 12 декабря 2011

Вы пробовали:

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

Другой способ достичь желаемого без отражения во время выполнения (но с большей работой, если в библиотеку добавлен новый подтип Foo с методом bar), - определить класс типов trait Barred[T], implicit экземпляров Barred[A] и Barred[B], и используйте связанный тип:

def doStuff[T : Barred](b: T)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...