![](/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.