![](/img/trans.png)
[英]expected trait object `dyn Responsability`, found type parameter `T`
[英]Struct won't coerce to implemented dyn Trait type in function return
我有以下 Rust 代碼
use std::{
cell::{Ref, RefCell},
rc::Rc,
};
trait TraitA {
fn data(&self) -> Ref<Vec<Rc<dyn TraitB>>>;
}
struct A {
data: RefCell<Vec<Rc<B>>>,
}
impl TraitA for A {
fn data(&self) -> Ref<Vec<Rc<dyn TraitB>>> {
self.data.borrow()
}
}
trait TraitB {}
struct B {}
impl TraitB for B {}
但是我收到以下錯誤
error[E0308]: mismatched types
--> src/lib.rs:16:9
|
15 | fn data(&self) -> Ref<Vec<Rc<dyn TraitB>>> {
| ------------------------ expected `Ref<'_, Vec<Rc<(dyn TraitB + 'static)>>>` because of return type
16 | self.data.borrow()
| ^^^^^^^^^^^^^^^^^^ expected trait object `dyn TraitB`, found struct `B`
|
= note: expected struct `Ref<'_, Vec<Rc<(dyn TraitB + 'static)>>>`
found struct `Ref<'_, Vec<Rc<B>>>`
我嘗試將A
中的data
字段設置為RefCell<Vec<Rc<dyn TraitB>>>
類型。 那可行。
但是在我的實現中,我希望該字段包含B
類型,因為我希望 Vec僅存儲類型B
,而不是TraitB
的任何實現。
我的理解是 Rust 應該能夠根據需要強制轉換B
類型,只要它實現了特征TraitB
,在上面的例子中, B
確實實現TraitB
。
例如,在以下代碼段中, Rc<dyn TraitB>
成功強制轉換為Rc<B>
沒問題。
struct C {
weak_ref: Weak<B>,
}
impl C {
fn upgrade_weak_ref(&self) -> Rc<dyn TraitB> {
self.weak_ref.upgrade().unwrap()
}
}
所以我的問題是,為什么強制在上面的第一個例子中不起作用。 是因為它包含在Ref
中嗎? 是否有解決方法或某種方法可以在不更改 struct A
中data
字段類型的情況下使其工作?
Rc<dyn TraitB>
的大小是Rc<B>
的兩倍(兩種用途對一種用途)。 因此,沒有辦法在不重建向量的情況下將Vec<Rc<B>>
強制轉換為Vec<Rc<dyn TraitB>>
。
您可以存儲Vec<Rc<dyn TraitB>>
,但只有推送B
的方法,因此可以防止誤用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.