Меня учили, что интерфейс Marker в Java является пустым интерфейсом и используется, чтобы сигнализировать компилятору или JVM, что объекты класса, реализующего этот интерфейс, должны обрабатываться особым образом, например, сериализация, клонирование и т. Д.
Но в последнее время я узнал, что это на самом деле не имеет ничего общего с компилятором или JVM. Например, в случае интерфейса Serializable
метод writeObject(Object)
из ObjectOutputStream
делает что-то вроде instanceOf Serializable
, чтобы определить, реализует ли класс Serializable
и throws NotSerializableException
соответственно. Все обрабатывается в коде, и это, кажется, шаблон дизайна, поэтому я думаю, что мы можем определить наши собственные интерфейсы маркеров.
Теперь мои сомнения:
Является ли определение интерфейса маркера, упомянутое выше в 1-й точке, неверным? Как тогда мы можем определить интерфейс Marker?
И вместо использования оператора instanceOf
, почему метод не может быть чем-то вроде writeObject(Serializable)
, так что есть время компиляции проверка типов, а не время выполнения?
Чем аннотации лучше, чем интерфейс маркеров?