// 定义一个特征
trait MyTrait {
fn print_info(&self);
}
// 定义一个结构体并实现MyTrait特征
struct MyStruct {
data: i32,
}
impl MyTrait for MyStruct {
fn print_info(&self) {
println!("Data: {}", self.data);
}
}
// 定义一个泛型函数,接受实现了MyTrait特征的类型参数,并返回该类型的实例
fn create_instance<T: MyTrait + Default>() -> T {
T::default()
}
fn main() {
// 调用泛型函数并将返回值赋给特征对象
let instance: Box<dyn MyTrait> = Box::new(create_instance::<MyStruct>());
// 调用特征对象的方法
instance.print_info();
}
类型检查和多态的实现原理
- 类型检查:
- 在Rust中,泛型函数
create_instance
的类型参数T
有约束T: MyTrait + Default
。这意味着只有实现了MyTrait
特征且实现了Default
特征的类型才能作为T
的具体类型。在调用create_instance::<MyStruct>()
时,编译器会检查MyStruct
是否实现了MyTrait
和Default
特征,若没有实现则会报错。这保证了在编译期就进行严格的类型检查,确保程序在运行时不会出现类型不匹配的错误。
- 多态:
- 这里使用了特征对象
Box<dyn MyTrait>
来实现多态。特征对象是一种动态分发的方式,它允许我们在运行时根据对象的实际类型来调用相应的方法。在let instance: Box<dyn MyTrait> = Box::new(create_instance::<MyStruct>());
中,我们将create_instance
返回的具体类型MyStruct
对象装箱成Box<dyn MyTrait>
特征对象。当调用instance.print_info()
时,Rust会根据instance
实际指向的对象类型(这里是MyStruct
)来调用MyStruct
实现的print_info
方法。这就实现了多态,即通过相同的特征对象调用方法,根据实际对象类型的不同执行不同的代码逻辑。