我可以安全地将 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;
}
另请参阅:
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;
}
另请参阅: