为什么有必要在特征对象中指定关联类型



此代码不编译:

trait Trait {
type Type;
}
struct Struct;
impl Trait for Struct {
type Type = i32;
}
fn main() {
Box::new(Struct) as Box<dyn Trait>;
}

修复方法是更改

Box::new(Struct) as Box<dyn Trait>;

进入

Box::new(Struct) as Box<dyn Trait<Type = i32>>;

我想知道为什么我们必须在特征对象中指定关联类型。编译器不是要查找impl Trait for Struct并找到type Type = i32吗?

从另一个角度思考这个问题。您得到了Box<dyn Trait>如何您知道什么是Trait::Type?嗯,你不能。属性对象具有类型擦除的功能。由于你可以依赖于这个相关的类型,你必须确保你能命名它

例如,如果你得到了Vec<Box<dyn Trait>>,并且想要得到Vec<Trait::Type>(为了这个例子,假设是Trait::Type: Clone(,你怎么能要求所有特征对象都具有相同的关联类型?答案就在你的问题中。你只需要指定它。如果没有它,你会很快在墙上奔跑。

最新更新