2017-04-22 11 views
1

インスタンスとその実装についてかなり深刻な混乱があります。私はList<String>がインタフェースであることを知っているが、私は、基準変数としてのタイプを使用することができ、私はまた、RHSが実際Listの実装であるArrayListを返すことを知っているのでJAVA:インスタンスリファレンスとの混乱

List<String> lines = Files.readAllLines(Paths.get(fileAddress), 
    Charset.defaultCharset()); 

上記のコードが有効です。また、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を返すことも知っています。実装、または実行時の実際の時間を調べることによって? 'Files.readAllLines'の*宣言*は' List ' –

+0

を返します。コンパイラは定義に基づいてコードをコンパイルします。どのような実装が行われているかを知るためにメソッドの内部を詮索することはありません。 (幸いにも。) –

答えて

0

Javaコンパイラは、メソッドから返される型を「認識」しません。

java.util.listinterfaceであり、すべての既知のリストインターフェイス実装のリストがあります。

これは、readAllLines方法Files.readAllLinesため
public static List<String> readAllLines(Path path, Charset cs) throws IOException
ドキュメントの署名です。

readAllLinesメソッドがList<String>を返すという情報だけがコンパイラにはありますが、実装には情報はありません。なぜなら、コンパイラはコードをコンパイルできないからです。