Trait upcasting наконец стабилизирован: &dyn Sub спокойно кастится в &dyn Super , если trait Sub: Super . Приведение трейт-объекта — это когда &dyn Sub превращается в &dyn Super , где trait Sub: Super . Есть у нас let x = MyType; , и MyType реализует и Sub, и Super, тогда и &x as &dyn Sub , и &x as &dyn Super работали с Rust 1.0. Проблема начиналась там, где конкретный тип уже потерян под dyn:fn take_super(x: &dyn Super) { x.base(); } fn call_it(sub: &dyn Sub) { take_super(sub); // до 1.86: expected `&dyn Super`, found `&dyn Sub` }Компилятор знал, что каждый Sub также Super , но всё равно спотыкался. Компилятор знает, что в vtable Sub на известном заранее смещении лежит указатель на vtable Super.