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

标签 rust traits dynamic-dispatch trait-objects

这个问题在这里已经有了答案:





Why doesn't Rust support trait object upcasting?

(4 个回答)


1年前关闭。




我有一个库需要实现特定特征( TQDispatch )。
在我的主要项目中,我有一个对象向量,它们都实现了动态调度所需的不同特征( Device )。
声明了设备特征

pub trait Device: TQDispatch{..}
我的期望是我可以从 Device 的列表中取出一个项目。实现者并获取其TQDispatch -ness,以便我可以将其传递给图书馆。鉴于任何实现 Device还实现了TQDispatch ,这似乎应该是可能的。
我可以将原始的“真实”对象转换到任何一个,但我找不到如何在这两个特征之间进行转换。
澄清:这些是Arc<dyn Device>在我的项目向量中,我需要它们是 Arc<dyn TQDispatch>为图书馆。

最佳答案

I can cast the original 'real' object to either, but I cannot find how to cast between the 2 traits.


您需要在“子特征”中实现显式转换。
Rust 不是基于继承的语言,所以
pub trait Device: TQDispatch{..}
表示“设备需要 TQDispatch”,而不是“设备扩展 TQDispatch”。
如果您想要 Arc输出,您还需要为此创建一个全新的 Arc,因为 dyn Devicedyn TQDispatch完全是不同的值(value)观。

关于rust - 如何将 `Arc<dyn SubTrait>` 转换为 `Arc<dyn SuperTrait >` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63554958/

相关文章:

rust - `&**self` 的类型是什么?

rust - 创建一个实现特定 Fn 接口(interface)的结构

Scala:如何在特征中添加依赖于类型的方法?

virtual-functions - Swift 有动态调度和虚方法吗?

Java方法访问运行时多态性

ios - Swift 函数中的动态修饰符

debugging - 使用 rust-gdb 进行调试时,如何进入在返回值中调用的函数?

image-processing - 这种用于图像缩放的最近邻算法有什么问题?

rust - 这个作用域线程代码可以更改为使用 `FnOnce()` 而不是 `Box<FnOnce()>` 吗?

scala - Scala 中 trait 中使用的抽象值有什么问题吗?