如何在 Rust 中创建对通用特征对象的引用的 Vec?

问题描述

我是 Rust 的新手。我的背景是Java。我正在尝试解决以下问题。

  1. 我有一个为 trait Fuelstruct Diesel 实现的 struct Gas
  2. 我还有一个带有 trait Vehicle 泛型类型参数的 Fuel。 Vehicle 是为 struct Car<F: Fuel>struct Bus<F: Fuel> 实现的。

最后,我想把对可能的异构特征对象的引用放到一个 Vec 中,如下所示:

let diesel_car = Car { fuel: Diesel {} };
let gas_car = Car { fuel: Gas {} };
let diesel_bus = Bus { fuel: Diesel {} };
let gas_bus = Bus { fuel: Gas {} };

let garage = vec![
    &diesel_car,&gas_car,&diesel_bus,&gas_bus
];

但是我得到这个编译错误:

error[E0308]: mismatched types
  --> src/main.rs:63:9
   |
63 |         &gas_car,|         ^^^^^^^^ expected struct `Diesel`,found struct `Gas`
   |
   = note:   expected type `&Car<Diesel>`
           found reference `&Car<Gas>`

这个 Vec 中引用的泛型类型应该是什么?它猜测它应该类似于 Vec<&dyn Vehicle>。但是这个变体也不能编译,因为它想提前知道 Vehicle 的泛型类型参数。在 Java 中,我只会写 List<Vehicle<?>。 Rust 中有没有类似的东西?

整个示例在 playground 中可用。

附言我显然可以从 Vehicle 中删除一个通用参数并将其替换为 Box<dyn Fuel>,但我想通过动态调度来最小化位置。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)