我有以下代码:
pub trait Handler<T: Clone>: Clone {
fn invoke(&self) -> Result<(), std::io::Error>;
}
#[derive(Clone)]
pub struct App<T: Clone> {
handlers: Vec<Box<dyn Handler<T>>>,
}
fn main() -> Result<(), std::io::Error> {
#[derive(Clone)]
struct MyHandler<T: Clone> { tt: T }
impl<T: Clone> Handler<T> for MyHandler<T> {
fn invoke(&self) -> Result<(), std::io::Error> { () }
}
let app = App { handlers: vec![ MyHandler{ tt: 0 }, MyHandler{ tt: 5 } ] };
这会产生编译错误:
error[E0038]: the trait `Handler` cannot be made into an object
--> src/main.rs:8:5
|
8 | handlers: Vec<Box<dyn Handler<T>>>,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Handler` cannot be made into an object
|
= note: the trait cannot require that `Self : Sized`
即使我不尝试将特征转换为具体对象。 我不明白:box结构应该允许我存储未知大小的类型。
目标是存储Vec
个实现者中的一个Handler
,以便为所有对象提供invoke
方法。