An example of the application of marker interfaces from the Java programming language is the Serializable interface:
A class implements this interface to indicate that its non-transient data members can be written to an ObjectOutputStream. The ObjectOutputStream private method writeObject0(Object,boolean) contains a series of instanceof tests to determine writeability, one of which looks for the Serializable interface. If any of these tests fails, the method throws a NotSerializableException.
One problem with marker interfaces is that, since an interface defines a contract for implementing classes, and that contract is inherited by all subclasses, a marker cannot be "unimplemented". In the example given, any subclass not intended for serialization (perhaps it depends on transient state), must explicitly throw NotSerializableException exceptions (per ObjectOutputStream docs).
Another solution is for the language to support metadata directly:
Effective Java3 by Joshua Bloch.
Bloch, Joshua (2008). "Item 37: Use marker interfaces to define types". Effective Java (Second ed.). Addison-Wesley. p. 179. ISBN 978-0-321-35668-0. 978-0-321-35668-0 ↩
"Marker interface in Java". GeeksforGeeks. 2017-03-06. Retrieved 2022-05-01. https://www.geeksforgeeks.org/marker-interface-java/ ↩
Bloch, Joshua (2018). Effective Java (Third ed.). Boston. ISBN 978-0-13-468599-1. OCLC 1018432176.{{cite book}}: CS1 maint: location missing publisher (link) 978-0-13-468599-1 ↩