針對如下代碼片段的疑惑:
public interface AA {
public AA getOne();
}
接口本身無法實例化。當方法返回類型為接口時,實際返回的是實現該接口的具體類的實例。這與「父類引用指向子類對象」的多態機制完全一致。
public interface AA {
AA getOne();
}
public class BB implements AA {
@Override
public AA getOne() {
return new BB(); // 返回實現類自身的實例
}
public void doSomething() {
System.out.println("BB 具體實現");
}
}
// 使用端
AA aa = new BB().getOne(); // aa 的靜態類型是 AA,運行時類型是 BB
if (aa instanceof BB) {
((BB) aa).doSomething(); // 向下轉型調用具體方法
}
誤以為「返回接口」意味著返回一個接口對象。實則接口只有方法簽名,無狀態、無構造器,無法 new AA()。返回值永遠是某個 implements AA 的類的實例。