Как устранить неоднозначность связанных типов?

Мой текущий код выглядит так:

pub trait A {}
pub trait HasA {
    type A: A;
    fn gimme_a() -> Self::A;
}

pub trait RichA: A {}
pub trait RichHasA: HasA {
    type A: RichA;
    fn gimme_a() -> Self::A;
    // ... more things go here ...
}

pub fn main() {}

Моя цель — использовать RichHasA как HasA. Приведенный выше код не компилируется с:

error[E0221]: ambiguous associated type `A` in bounds of `Self`
  --> src/main.rs:10:21
   |
3  |     type A: A;
   |     ---------- ambiguous `A` from `HasA`
...
9  |     type A: RichA;
   |     -------------- ambiguous `A` from `RichHasA`
10 |     fn gimme_a() -> Self::A;
   |                     ^^^^^^^ ambiguous associated type `A`

что имеет смысл. Как я могу устранить неоднозначность связанных типов?


person ynimous    schedule 06.07.2015    source источник


Ответы (1)


Вы можете использовать то, что называется Полный синтаксис (FQS):

fn gimme_a() -> <Self as HasA>::A;
fn gimme_a() -> <Self as RichHasA>::A;

Смотрите также:

person Shepmaster    schedule 06.07.2015