【Rust】dyn って一体何か?

例えば、こんな一文があります。

type BoxedHandler = dyn Fn(Request<Body>) -> Box<dyn futures::Future<Output = Response<Body>> + Send> + Send + Sync;

typeがエイリアスなのはわかりますが、dynって一体なんでしょうか?
=>
dyn はRustにおける動的ディスパッチ(dynamic dispatch)を表すキーワードで、トレイトオブジェクトを使うときに必要
L どの型が来るかは実行時に決まる
L 複数の異なる型を一つのコレクションで扱いたい

trait Animal {
    fn speak(&self);
}

struct Dog;
struct Cat;

impl Animal for Dog {
    fn speak(&self) {
        println!("Woof!");
    }
}

impl Animal for Cat {
    fn speak(&self) {
        println!("Meow!");
    }
}

fn make_animal_noise(animal: &dyn Animal) {
    animal.speak();
}

fn main() {
    let dog = Dog;
    let cat = Cat;

    make_animal_noise(&dog);
    make_animal_noise(&cat);
}

うーん、わかったようなわかってないような…
別の例に置き換える

trait BulletTrain {
    fn run(&self);
}

struct TohokuShinkansen;
struct YamagataShinkansen;

impl BulletTrain for TohokuShinkansen {
    fn run(&self) {
        println!("東京-山形");
    }
}

impl BulletTrain for YamagataShinkansen {
    fn run(&self) {
        println!("東京-青森");
    }
}

fn travel_to_tohoku(bullettrain: &dyn BulletTrain) {
    bullettrain.run();
}

fn main() {
    let hayabusa1 = TohokuShinkansen;
    let tsubasa1 = YamagataShinkansen;

    travel_to_tohoku(&hayabusa1);
    travel_to_tohoku(&tsubasa1);
}

$ ./playground
東京-山形
東京-青森