1/6

A generic gives you one type per instantiation. When you need several different types in one collection, you need a trait object:

let checks: Vec<Box<dyn Check>> = vec![Box::new(Ping), Box::new(Disk)];

dyn Check is not a type with a known size, so it always appears behind a pointer — Box<dyn Check>, &dyn Check, Arc<dyn Check>. That pointer is fat: two words, one to the data and one to the vtable.