#![feature(unsize)] use std::marker::Unsize; pub trait CastTo: Unsize { fn cast_to(&self) -> &T; } impl> CastTo for U { fn cast_to(&self) -> &T { self } } impl Cast for T {} pub trait Cast { fn cast(&self) -> &T where Self: CastTo, { self } } pub trait Foo: CastTo<[i32]> {} impl Foo for [i32; 0] {} fn main() { let x: &dyn Foo = &[]; let x = x.cast::<[i32]>(); //~^ ERROR: the trait bound `dyn Foo: CastTo<[i32]>` is not satisfied }