【发布时间】:2021-05-11 05:35:36
【问题描述】:
我是 Rust 的新手。我的背景是Java。我正在尝试解决以下问题。
- 我有一个为
struct Diesel和struct Gas实现的trait Fuel。 - 我还有一个
trait Vehicle和Fuel泛型类型参数。车辆为struct Car<F: Fuel>和struct Bus<F: Fuel>实现。
最后,我想将可能的异构 trait 对象的引用放到一个 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>,但我想通过动态调度来最小化位置。
【问题讨论】:
标签: generics rust polymorphism traits trait-objects