我有Box<Trait>
,希望能够将其投放到Box<Obj>
。据说有BoxAny这样做,但尝试致电t.downcast::<Obj>()
表示范围内没有方法downcast
。
如果您有参考文档,文档会显示如何执行此操作。你可以&Trait as &Any
。但似乎不可能boxedTrait as Box<Any>
。
这是显示我的意思的playground。
答案 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),但它不是很漂亮。
不幸的是,我不知道做这种事情的简单方法。这样的事情很可能用一些不安全的代码来实现,但我不知道如何。