我可以安全地将Box <dyn Any + Send>投射到Box <dyn Any>吗?

时间:2020-01-28 16:20:17

标签: rust unsafe

Send是标记特征,对内存布局没有任何影响。也就是说,Any类型的机制对我来说仍然有点神秘。

下面的代码是声音,并且可以执行我想要的操作:强制转换类型始终正确地转换为原始的具体类型:

let what_i_have: Box<dyn Any + Send> = Box::new(69);
let ptr = Box::into_raw(what_i_have);
let what_i_want: Box<dyn Any> = unsafe { Box::from_raw(ptr as *mut dyn Any) };

我已经试过了,它“似乎工作正常”。是吗?

作为奖励问题,我可以在没有unsafe块的情况下进行此操作吗?

1 个答案:

答案 0 :(得分:3)

是的,您可以通过分配值来安全地执行此操作:

use std::any::Any;

fn main() {
    let what_i_have: Box<dyn Any + Send> = Box::new(69);
    let what_i_want: Box<dyn Any> = what_i_have;
}

另请参阅: