For example I've been working on a Json library that stores everything in an enum (ADT):
public enum JsValue {
case JsString(String)
case JsNumber(Double)
case JsObject([String: JsValue])
case JsArray([JsValue])
case JsBoolean(Bool)
case JsNull
}Trait objects in Rust let you emulate inheritance. The issue I was talking about is that folks from inheritance-heavy languages use this as the de facto design pattern, and then stuff doesn't work so well, because you're not supposed to use inheritance so much (the languages aren't designed with this in mind). The correct option is to use enums and composition over inheritance wherever possible.
Saying use composition over inheritance "wherever possible" can lead to some cargo culting on its own. It is always possible to use composition over inheritance, but it isn't always wise.
Pretty much what I meant, when I said "wherever possible" I meant "wherever possible with decent code", sorry about the confusion.