我有一个Box<Trait>
,并希望能够将其投射到Box<Obj>
。有BoxAny http://doc.rust-lang.org/std/boxed/trait.BoxAny.html据说这样做,但试图打电话t.downcast::<Obj>()
说没有方法downcast
在适用范围。
如果您有参考,文档将显示如何执行此操作。你可以这样做&Trait as &Any
。但这似乎不可能做到boxedTrait as Box<Any>
.
这是一个操场 http://is.gd/oe5bvt显示我的意思。
Any
允许向下转换为具体类型,因此您need当您转换为时了解这个具体类型Box<Any>
。但是,如果您只有某个其他特征的特征对象,那么您就不知道具体类型 - 这正是特征对象的要点。所以你不能从Box<SomeTrait>
to Box<Any>
, 是不可能的。
理想情况下应该可以写类似的东西Box<Show+Any>
。这将允许使用Show
方法以及Any
方法。然而,这也是不可能的:除了主要特征之外,您只能编写生命周期界限和内置类型,因此Box<Show+Sync+'a>
是合法的,但是Box<Show+Any>
is not.
如果您拥有想要使用的特质Any
,那么实现这一点的一种方法是特征继承:
trait MyTrait : Any {
// ...
}
但是,继承不适用于特征对象,因此您无法调用Any
上的方法Box<MyTrait>
。有一个解决方法,涉及重新实现Any
(可以发现here https://github.com/teepee/teepee/blob/7ef85de23c84642f248922a6b48d16a642669448/src/httpcommon/headers/mod.rs),但它一点也不漂亮。
不幸的是,我不知道做这种事情的简单方法。像这样的事情可能可以用一些不安全的代码来实现,但我不知道如何实现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)