Как я могу вставить объект, реализующий признак с параметром признака, в Vec?

Я пытаюсь вставить объект, реализующий черту с параметром черты, в Vec:

trait IRequest {}

trait IRequestHandler<T>
where
    T: IRequest,
{
    fn handle(&self, request: T);
}

pub struct CreateTodoRequest();

impl IRequest for CreateTodoRequest {}

pub struct CreateTodoRequestHandler();

impl IRequestHandler<CreateTodoRequest> for CreateTodoRequestHandler {
    fn handle(&self, request: CreateTodoRequest) {}
}

fn main() {
    let request = CreateTodoRequest {};
    let handler = CreateTodoRequestHandler();
    let mut handlers: Vec<&dyn IRequestHandler<dyn IRequest>> = Vec::new();

    handlers.push(&handler);
}

Я получаю сообщение об ошибке:

error[E0277]: the trait bound `CreateTodoRequestHandler: IRequestHandler<dyn IRequest>` is not satisfied
  --> src/main.rs:25:19
   |
25 |     handlers.push(&handler);
   |                   ^^^^^^^^ the trait `IRequestHandler<dyn IRequest>` is not implemented for `CreateTodoRequestHandler`
   |
   = help: the following implementations were found:
             <CreateTodoRequestHandler as IRequestHandler<CreateTodoRequest>>
   = note: required for the cast to the object type `dyn IRequestHandler<dyn IRequest>`

Когда у меня было IRequestHandler без параметра я мог бы использовать его и вставить в Vec. Проблема возникает только тогда, когда признак имеет параметр.

Можно ли преобразовать объект в трейт с параметром, который он реализует?

0 ответов

Другие вопросы по тегам