在使用 trait 对象时,如果不使用泛型类型参数,编译器将无法确定具体实现的类型,从而无法进行相关的编译检查。
例如,下面是一个使用 trait 对象的示例:
trait MyTrait {
fn do_something(&self);
}
struct MyStruct;
impl MyTrait for MyStruct {
fn do_something(&self) {
println!("do something");
}
}
fn main() {
let obj: Box<dyn MyTrait> = Box::new(MyStruct);
obj.do_something();
}
在这个示例中,我们需要使用 trait 对象来保存实现了 MyTrait trait 的类型,并在运行时进行具体化。然而,如果我们直接使用 obj.do_something()
方法进行调用,编译器将无法确定 obj
实际上是哪个具体类型的实现对象。
为了解决这个问题,我们需要在调用方法时使用 turbofish 符号来明确指定泛型类型参数。对于上面的示例,我们应该使用 obj.do_something::<MyStruct>()
来调用具体实现类型的方法。
fn main() {
let obj: Box<dyn MyTrait> = Box::new(MyStruct);
obj.do_something::<MyStruct>();
}