我是 Rust 的新手。我的背景是Java。我正在尝试解决以下问题。
- 我有一个
trait Fuel
为struct Diesel
and实现的struct Gas
。 - 我也有一个
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 中是否有类似的东西?
整个示例可在操场上找到。
PS我显然可以从中删除一个通用参数Vehicle
并将其替换为Box<dyn Fuel>
,但我想通过动态调度来最小化位置。