error[E0271]: type mismatch resolving `<TypeX as Trait>::Assoc == TypeY`

関連型』が期待する型と異なっていた。

原因

関連型まで指定されたトレイト境界があり、対象の型はそれに適合する事が期待されていた。しかし、指定されたトレイトは実装していたものの、そこから導かれる関連型が指定されたものと別の型だった。

サンプル

以下では、func に渡される u32 型が引数型 T の境界に適合せずエラーになる。なぜなら、u32 型は Unsigned トレイトを実装するが、Unsigned::Signed により導かれる型は i64 ではなく i32 になる。


fn main() {
    func(1_u32);
}

fn func<T>(val: T) where T: Unsigned<Signed=i64> {
    println!("{}", val.negative());
}

trait Unsigned {
    type Signed;
    fn negative(&self) -> Self::Signed;
}

impl Unsigned for u32 {
    type Signed = i32;
    fn negative(&self) -> Self::Signed {
        -(*self as i32)
    }
}

error[E0271]: type mismatch resolving `<u32 as Unsigned>::Signed == i64`
  --> src\main.rs:2:10
   |
2  |     func(1_u32);
   |     ---- ^^^^^ type mismatch resolving `<u32 as Unsigned>::Signed == i64`
   |     |
   |     required by a bound introduced by this call
   |
note: expected this to be `i64`
  --> src\main.rs:15:19
   |
15 |     type Signed = i32;
   |                   ^^^
note: required by a bound in `func`
  --> src\main.rs:5:38
   |
5  | fn func<T>(val: T) where T: Unsigned<Signed=i64> {
   |                                      ^^^^^^^^^^ required by this bound in `func`