The latest stable version of Rust (1.27) allows implementing a trait for trait objects (dyn Trait
), so I tried the following:
trait T1 {
fn f1(&self);
}
trait T2 {
fn f2(&self);
}
impl T2 for dyn T1 {
fn f2(&self) {
self.f1()
}
}
struct S();
impl T1 for S {
fn f1(&self) {}
}
fn main() {
let t1 = S();
let t12: &T1 = &t1;
t12.f2();
let t2: &T2 = &t12;
t2.f2();
}
The above code results in an error:
error[E0277]: the trait bound `&T1: T2` is not satisfied
--> src/main.rs:21:19
|
21 | let t2: &T2 = &t12;
| -^^^
| |
| the trait `T2` is not implemented for `&T1`
| help: consider removing 1 leading `&`-references
|
= help: the following implementations were found:
<T1 + 'static as T2>
= note: required for the cast to the object type `T2`
This is confusing as &T1
is an instance of dyn T1
and so has a T2
implementation. We can even witness this by the fact that we can call f2
on t12
directly, as removing the last two lines in main
makes it compile.
Is it possible to create a trait object from a trait object that marked as a different trait?