2011-12-12 4 views
4

рассмотреть этот дизайн библиотеки мне нужно использовать и не может исправить:структурный тип с верхней границей?

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, которые я хочу.

Я хотел бы описать перемычку таким образом, что она является как подтипом Foo и имеет метод бара, и я не могу :(Помогите оценил

ответ

9

Просто

type Barred = Foo {def bar: Foo } 
+0

вздох, спасибо. Я думаю, это будет для меня. –

1

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

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

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

def doStuff[T : Barred](b: T) 
+0

Я шел таким образом, но не хотел повторения в подписи. Интересно, спасибо. –

1

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

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

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

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

который @ didierd ответ нет.

+0

приятно, я посмотрю, играет ли он с моим настоящим кодом. –

Смежные вопросы