如何将Arc <dyn SubTrait>转换为Arc <dyn SuperTrait>?

问题描述

我有一个需要一些东西来实现特定特征(TQdispatch)的库。

在我的主项目中,我有一个对象向量,这些对象都实现了动态分配所需的不同特征(Device)。

设备特征已声明

pub trait Device: TQdispatch{..}

我的期望是,我可以从Device实现者​​的列表中取出一个项目,并以其TQdispatch的身份进行访问,以便将其传递给库。假设实现Device的任何事物也实现TQdispatch,这似乎应该是可能的。

我可以将原始的“真实”对象转换为任意一个,但是我找不到如何在两个特征之间进行转换。

说明:这些在我的项目向量中为Arc<dyn Device>,对于库我需要它们为Arc<dyn TQdispatch>

解决方法

我可以将原始的“真实”对象转换为任意一个,但是我找不到如何在这两个特征之间进行转换。

您需要在“子特性”中实现显式转换。

Rust不是基于继承的语言,所以

pub trait Device: TQDispatch{..}

表示“设备需要 TQDispatch”,而不是“设备扩展 TQDispatch”。

如果您想要Arc输出,则还需要为此创建一个全新的Arc,因为dyn Devicedyn TQDispatch完全是不同的值。