转换为Box <any> </any>

时间:2014-10-27 19:38:32

标签: rust

我有Box<Trait>,希望能够将其投放到Box<Obj>。据说有BoxAny这样做,但尝试致电t.downcast::<Obj>()表示范围内没有方法downcast

如果您有参考文档,文档会显示如何执行此操作。你可以&Trait as &Any。但似乎不可能boxedTrait as Box<Any>

这是显示我的意思的playground

1 个答案:

答案 0 :(得分:2)

Any允许向下转换为具体类型,因此当您转换为Box<Any>时,需要知道此具体类型。但是,如果你只有一个其他特征的特征对象,你就不知道具体的类型 - 这正是特征对象的关键点。因此,您无法从Box<SomeTrait>转到Box<Any>,这是不可能的。

理想情况下,应该可以编写Box<Show+Any>之类的内容。这将允许使用Show方法以及Any方法。但是,这也是不可能的:除了主要特征之外,您只能编写生命周期边界和内置类型,因此Box<Show+Sync+'a>是合法的,但Box<Show+Any>不合法。

如果您拥有要与Any一起使用的特征,那么实现这一目标的方法就是特质继承:

trait MyTrait : Any {
    // ...
}

但是,继承不适用于特征对象,因此您无法在Any上调用Box<MyTrait>方法。有一个解决方法,涉及重新实现Any(可以找到here),但它不是很漂亮。

不幸的是,我不知道做这种事情的简单方法。这样的事情很可能用一些不安全的代码来实现,但我不知道如何。