1/6

Not every trait can become a dyn Trait. A trait is object safe only if every method can be called through a vtable — that is, knowing nothing about the concrete type but its address.

Two rules cause almost every real failure:

  1. No generic methods. fn build<T: Encode>(&self, v: T) would need one vtable slot per possible T, and the set is unbounded.
  2. No Self in return position. fn clone_me(&self) -> Self cannot work: the caller has no idea what Self is or how big it is.