我可以安全地将 Box<dyn Any + Send> 转换为 Box<dyn Any> 吗?

Can I safely cast Box<dyn Any + Send> to Box<dyn Any>?

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) };

我玩过这个,"seems to work fine"。是吗?

作为奖励问题,我可以在没有 unsafe 块的情况下这样做吗?

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

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;
}

另请参阅: