2017-04-22 119 views
1

我對實例及其實現有一些非常嚴重的困惑。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>

這怎麼可能?

+1

'readAllLines'被定義爲返回'List ',這就是調用代碼必須依賴的。它實際上返回'ArrayList '是一個實現細節,可以在不影響調用者的情況下進行更改 –

+2

「我也知道RHS實際上返回一個ArrayList,它是List的實現」 - 你怎麼知道的?通過查看執行情況,還是執行時的實際時間? 'Files.readAllLines'的*聲明只說它返回一個'List ' –

+0

編譯器根據定義編譯你的代碼。它不會在方法內部窺探哪些實現。 (幸運)。 –

回答

0

Java編譯器不會「知道」將從該方法返回哪種類型。

java.util.listinterface,並且列出了所有已知的列表接口實現。

這是簽名readAllLines方法
public static List<String> readAllLines(Path path, Charset cs) throws IOException
的文檔Files.readAllLines

編譯器只有信息,readAllLines方法將返回List<String>,但它沒有信息的實現它將是。因爲它編譯器無法編譯代碼。