在 Rust 中为什么需要类型注释,即使它们在通用特征中明确指定

In rust why are type annotations required even if they are explicitly specified in a generic trait

如何编译这段代码:

pub trait X<ApplyData> {
    fn apply(data: &mut ApplyData);
}

pub trait AAA<ApplyData, Functions: X<ApplyData>> {
    fn aaa(data: &mut ApplyData) {
        //...default code that may use Functions...and call X::apply()
    }
}

pub trait BBB<Data, Functions: X<Data>> {
    fn bbb(data: &mut Data) {
        AAA::<Data, Functions>::aaa(data); // I want to call the default aaa fn defined in the trait BBB
    }
}

我收到以下错误:

error[E0283]: type annotations required: cannot resolve `_: AAA<Data, Functions>`
  --> src/lib.rs:11:9
   |
11 |         AAA::<Data, Functions>::aaa(data);
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
note: required by `AAA::aaa`
  --> src/lib.rs:6:5
   |
6  |     fn aaa(data: &mut ApplyData);
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

在 rustc 抱怨它无法推断函数类型之前,当我只在 BBB 特征中编写 AAA::aaa(data); 时,我认为这是有道理的。 现在我明确地给了编译器 Functions 但我得到的错误对我来说是神秘的。

AAA 是一个特征,但是当一个方法被调用时,Rust 需要有足够的信息来确定使用哪个类型的实现。在这种情况下,它需要知道在调用 aaa.

时要使用 AAA 的哪个实现

但是,BBB 的签名中没有说明 使用 AAA 的哪个 实现。

很难知道您要做什么,但像这样的东西可以提供信息:

pub trait BBB<T, Data, Functions: X<Data>> 
where
    T: AAA<Data, Functions>
{
    fn bbb(data: &mut Data) {
        T::aaa(data);
    }
}

这就是说,当 BBB 的实现者的具体类型已知时,我们也将知道 T 的具体类型,它将提供 [=11] 的实现=].