不包含任何抽象方法的接口,稱為 Marker Interface(標記/標識接口)。類實現它們僅為賦予自身某種「標籤」語義,由 JVM 或框架在運行時檢測該標籤以決定行為。
public interface RandomAccess { }
get(i) 以 O(1) 時間隨機訪問元素(底層通常為陣列)。ArrayList 實現,LinkedList 不實現。list instanceof RandomAccess,是則用 for-i,否則用 foreach/迭代器,最大化性能。public void iterate(Listlist) { if (list instanceof RandomAccess) { for (int i = 0, n = list.size(); i < n; i++) { /* list.get(i) */ } } else { for (String s : list) { /* iterator */ } } }
public interface Cloneable { }
Object.clone() 深拷貝。Object.clone() 為 native 方法,內部檢查 this instanceof Cloneable,否則拋出 CloneNotSupportedException。public interface Serializable { }
ObjectOutputStream.writeObject() 內部檢查 obj instanceof Serializable,否則拋出 NotSerializableException。implements Cloneable 成為類型層級契約,編譯器可檢查,IDE 可導航。instanceof 語義清晰,無需反射讀取註解。編譯器生成的合成成員(如內部類捕獲字段、橋接方法)帶 ACC_SYNTHETIC 標誌,Member.isSynthetic() 可識別。標記接口本身不屬合成,但體現「編譯器協助語言語義」的設計哲學。
標記接口是面向對象層面的能力標籤,以零方法契約換取運行時行為分發。雖現代框架多改用註解,但理解其本質有助於設計乾淨的 API 契約。