不可能将未调整大小的类型转换为特征对象,因为这将强制它同时具有两组元数据.
请考虑以下代码:
trait Foo: 'static {
fn foo(self: Box<Self>) -> Box<dyn Foo> {
self
}
}
trait Bar {}
impl Foo for dyn Bar {}
impl Foo for i32 {}
impl<T> Bar for T {}
fn main() {
let boxed = Box::new(42);
boxed.foo();
let boxed: Box<dyn Bar> = Box::new(42);
boxed.foo();
}
在这种情况下,没有任何东西会禁止最后一次调用-所有签名都允许这样做.但是,如果我们将Box<dyn Bar>
强制为Box<dyn Foo>
,dyn Bar
的虚拟函数表将go 哪里?(当然,在本例中它是空的,但它仍然必须存在-空特征并不特殊)
但是,如果您将where Self: Sized
与foo
相加,则最后一个呼叫将被正确拒绝:
error: the `foo` method cannot be invoked on a trait object
--> src/main.rs:20:11
|
2 | fn foo(self: Box<Self>) -> Box<dyn Foo> where Self: Sized {
| ----- this has a `Sized` requirement
...
20 | boxed.foo();
| ^^^