这是Rust dynamic cast trait object between different taits的后续问题。当我们使用 trait 对象的引用时,那里提供的解决方案非常有效,但这次我试图对Rc
指针做同样的事情。例如
- 我有一个名为的超级特质
TraitAB
和两个名为TraitA
和的特质TraitB
- 所以当我第一次创建一个类型的特征对象
TraitAB
而不是使用 aBox
时,现在我使用了一个Rc
指针。 - 我需要一个类型的变量
TraitA
作为参考ab
在这里,我做了一个非常简单的例子:
use std::rc::Rc;
trait TraitAB: TraitA + TraitB {
fn as_a(&self) -> Rc<dyn TraitA>;
fn as_b(&self) -> Rc<dyn TraitB>;
}
trait TraitA {}
trait TraitB {}
struct MyType {}
impl TraitAB for MyType {
fn as_a(&self) -> Rc<dyn TraitA> {
Rc::clone(self)
}
fn as_b(&self) -> Rc<dyn TraitB> {
Rc::clone(self)
}
}
impl TraitA for MyType {}
impl TraitB for MyType {}
fn main() {
let a: Rc<dyn TraitA>;
let b: Rc<dyn TraitB>;
{
let mut ab: Rc<dyn TraitAB> = Rc::new(MyType {});
a = ab.as_a();
b = ab.as_b();
}
}
但这不起作用。根据错误信息:
error[E0308]: mismatched types
--> src/main.rs:15:19
|
15 | Rc::clone(self)
| ^^^^ expected struct `std::rc::Rc`, found struct `MyType`
|
= note: expected reference `&std::rc::Rc<dyn TraitA>`
found reference `&MyType`
error[E0308]: mismatched types
--> src/main.rs:18:19
|
18 | Rc::clone(self)
| ^^^^ expected struct `std::rc::Rc`, found struct `MyType`
|
= note: expected reference `&std::rc::Rc<dyn TraitB>`
found reference `&MyType`
as_a
并且as_b
不知道 self 实际上是一个Rc
指针。有没有办法对克隆的共享指针进行强制转换?