As David Newton said, marker interfaces have no special internal workings. They are indeed
empty and the compiler allows you to create your own that way. Marker interfaces are used
when the interface contract can not be enforced with just method signatures. Implementing
Cloneable, for example, means that the existing clone() method provided by Object has been
overridden. You assert that proper clone() behavior is provided. Similarly, when Serializable
is implemented, the user knows that serialization and deserialization will behave as described
in the documentation. The compiler does not force you to do this.