Basically, marker interfaces are used to indicate that a class supports a special
Java language functionality, but (unlike normal interfaces) this functionality isn't expressed solely through its method definitions.
Prior to Java 1.5, there was no way to describe a class's properties beyond the standard modifiers (public, private, etc), so marker interfaces were used for this purpose. Admittedly, it does feel a bit like a hack, because it's seems strange that Java assigns special meanings to a few interfaces (java.io.Serializable, java.lang.Cloneable, java.rmi.Remote, etc). Java 1.5 introduced
annotations, which (in my opinion) would have been a far better mechanism for these purposes, if annotations had existed when Java was first released.