嵌套通用实现

Nested generic impl

我不明白为什么 Rust 不允许在其他泛型约束中使用泛型。

用普通话很难解释,但是例如这个简单的代码行不通

trait GenericTraitA<T1> {}

trait GenericTraitB<T2> {}

impl<T1, T2: GenericTraitA<T1>> dyn GenericTraitB<T2> {}

上面写着:

the type parameter T1 is not constrained by the impl trait, self type, or predicates

但我不明白为什么这不受约束,我不明白这段代码中的歧义。

编译器错误的意思是,使用 impl 块定义,它无法确定合适的类型来替代 T1。让我们看一个具体的例子来证明这一点:

pub trait Trait<T> {
    fn foo(&self);
}

struct Bar;

impl Trait<u32> for Bar {
    fn foo(&self) {
        println!("u32 impl");
    }
}

impl Trait<u64> for Bar {
    fn foo(&self) {
        println!("u64 impl");
    }
}

impl<T, U> U
where
    U: Trait<T>,
{
    fn call_foo(&self) {
        self.foo();
    }
}

fn main() {
    let bar = Bar;
    bar.call_foo();
}

尝试编译此程序产生以下错误:

error[E0207]: the type parameter `T` is not constrained by the impl trait, self type, or predicates
  --> src/main.rs:19:6
   |
19 | impl<T, U> U
   |      ^ unconstrained type parameter

存在此错误的原因是,如果我们允许该 impl 块为 well-formed,bar.call_foo() 会出现不明确的行为。 Bar 实现了 Trait<u32>Trait<u64>,但是我们如何知道应该调用哪个版本的 foo?答案是我们没有,这就是为什么这个程序不能编译。