Java 初學者常見兩個疑惑:1. API 文檔中 Set 明明是接口,為何顯示為 class?2. HashSet 向上轉型為 Set 接口類型,接口不是不能實例化嗎?本文詳細解析。
這僅是 Javadoc 生成工具的呈現習慣。接口在字節碼層面也是一種類結構(.class 文件),文檔工具統一用「Class」標籤展示,不影響其語義。心知它是接口即可。
代碼:
Set<String> set = new HashSet<>();
等號左邊 Set<String> set 是變量類型聲明,表示變量 set 的靜態類型是 Set 接口。
等號右邊 new HashSet<>() 是對象創建,創建的是 HashSet 具體實現類的實例。
new,右邊永遠是實現類的對象。set 是 Set 類型,只能調用 Set 定義的方法;運行時對象是 HashSet,實際執行其覆寫方法。Animal a = new Dog(); — Animal 可以是類也可以是接口,Dog 是具體實現。同理,Set 是接口,HashSet 是實現。
class 為工具習慣,不影響接口本質。