如果可以将Box <t>强制转换为Box <b>,我该如何编写一个函数将T类型转换为任何Box <b>?

时间:2018-07-21 08:45:52

标签: rust

我正在尝试编写一个扩展特征,该特征允许我将类型为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>

0 个答案:

没有答案