I have a struct Foo
that implements traits A
and B
, where B
is a sub-trait of A
. I now pass a &Foo
to function alpha
taking a &B
, which works as expected. However, when in function alpha
I try to pass the pointer to function beta
which takes a &A
, the compiler complains that it expected trait A
, but got trait B
. See the following code:
trait A {}
trait B : A {}
struct Foo {}
impl A for Foo {}
impl B for Foo {}
fn alpha(x: &B) {
beta(x);
}
fn beta(x: &A) {}
I would expect this to work, since the functions in trait B
are a superset of the functions in A
. So given the vtable of B
, I should be able to construct the vtable of A
by just picking the right function pointers. Explicit casting (x as &A
) does not help either. Why does this not work?