即使提供也需要类型注释

Type annotation required even when provided

我想做这样的事情:

trait Trait {
    type Type;

    fn function<T>(val1: &T, ty: T::Type)
        where T: Trait
    {}
}

struct Struct;
impl Trait for Struct {
    type Type = u32;
}

fn main() {
    let val = Struct;
    Trait::function(&val, 5u32);
}

我得到了错误:error[E0284]: type annotations required: cannot resolve `<_ as Trait>::Type == _` (c.f rust playground)

但是即使我添加类型注释(Trait::function::<Struct>(&val, 5u32)),我也有同样的错误。

关于这个错误的原因有什么线索吗?

特征没有提到 selfSelf,但您似乎希望它以某种方式推断出您想要的实例。

假设您有另一个 Trait 的实现:

struct Struct2;
impl Trait for Struct2 {
    type Type = u32;
}

然后,即使您将 Struct 引用作为第一个参数传递,它对任一实现都有意义。这没关系:

let val = Struct;
<Struct as Trait>::function(&val, 5u32);

没关系:

let val = Struct;
<Struct2 as Trait>::function(&val, 5u32);

如果您希望通过传递给 function 的类型来确定实例,则参数类型应为 Self 而不是 T:

trait Trait {
    type Type;

    fn function(&self, ty: Self::Type) {}
}

现在,它无需额外的类型注释即可正确推断实例。