2017-01-27 4 views
8

Vec<Box<T>>ここで、TFooを実装しています。 Box<T>のタイプのものをBox<Foo>に強制することができますが、なぜ私はそれをVec<Box<Foo>>に強制することはできませんか?なぜ以下のコードはコンパイルされませんか?なぜRustは強制的にコンテナ内のオブジェクトに特化することができないのですか?

use std::vec; 

trait Foo {} 

struct Bar {} 

impl Foo for Bar {} 

fn main() { 
    let v = vec![Box::new(Bar {})]; 
    let v_1 = v as Vec<Box<Foo>>; 
} 
+0

あなたの興味に関係します:[キャストに関する最近の質問](http://stackoverflow.com/questions/41869048/is-there-a-trait-for-scalar-castable-types) – ljedrz

答えて

12

Box<Bar>Box<Foo>と異なるサイズですので。強制は単一値の値で許可されますが、ここではベクトル全体のサイズを変更する必要があります。この本の内容は、Representation of Trait Objectsのセクションで詳しく説明しています。短いバージョン:Box<Bar>は値へのポインタです。 Box<Foo>は、値のvtableへのポインタへのポインタです。

+0

ああ、そうだ。ありがとう! –

関連する問題