我正在尝试编写一个扩展特征,该特征允许我将类型为T
的任何值移动到任何Box<B>
中,其中可以将Box<T>
强制转换为Box<B>
。我的第一次尝试是:
trait IntoBox<B: ?Sized> {
fn into_box(self) -> Box<B>;
}
impl<T, B: ?Sized> IntoBox<B> for T
where
Box<T>: Into<Box<B>>,
{
fn into_box(self) -> Box<B> {
Box::new(self).into()
}
}
fn main() {
// Ok
let _: Box<u32> = 42.into_box();
// Error: the trait bound `std::boxed::Box<std::fmt::Display>:
// std::convert::From<std::boxed::Box<&str>>` is not satisfied
let _: Box<std::fmt::Display> = "Hello World".into_box();
}
此代码适用于常规框,但不适用于特征对象。我怀疑Into
在这里是错误的界限。我应该怎么用呢?
编辑:如对this问题的回答所述,可以通过为{提供一个总括的隐式形式来解决任何数量的具体类型T
的问题。 {1}}。但是,这在一般情况下不起作用,因为提示可能会冲突:
T: Unsize<U>