我對實例及其實現有一些非常嚴重的困惑。JAVA:與實例參考混淆
List<String> lines = Files.readAllLines(Paths.get(fileAddress),
Charset.defaultCharset());
上面的代碼是有效的,因爲我知道,List<String>
是一個接口,但我可以用它的類型作爲參考變量,我也知道,實際上RHS返回ArrayList
這是List
的實現。另外,lines.getClass().getName()
肯定返回java.util.ArrayList
。
但出乎意料的是,當我做,
ArrayList<String> lines = Files.readAllLines(Paths.get(fileAddress),
Charset.defaultCharset());
我得到一個錯誤,
Type mismatch: cannot convert from List<String> to ArrayList<String>
這怎麼可能?
'readAllLines'被定義爲返回'List',這就是調用代碼必須依賴的。它實際上返回'ArrayList '是一個實現細節,可以在不影響調用者的情況下進行更改 –
「我也知道RHS實際上返回一個ArrayList,它是List的實現」 - 你怎麼知道的?通過查看執行情況,還是執行時的實際時間? 'Files.readAllLines'的*聲明只說它返回一個'List' –
編譯器根據定義編譯你的代碼。它不會在方法內部窺探哪些實現。 (幸運)。 –