E4038

E4038#

Trait object for the type is not allowed.

Erroneous Example#

fn main {
  let a = 3 as &Eq
}

The example above tries to create an object of the Eq trait. This is not allowed, as the trait is not object safe.

The Eq trait is defined as follows:

pub(open) trait Eq {
  op_equal(Self, Self) -> Bool
}

... which is why the following error is given on line 2:

Trait object for Eq is not allowed: `Self` occur multiple times in the type of method op_equal

Suggestion#

Use an object-safe trait to create a trait object.

For a trait to be object-safe, its dispatchable functions must use and only use the Self type as the first parameter. For example, Show is such a trait:

pub(open) trait Show {
  output(Self, &Logger) -> Unit
  to_string(Self) -> String
}