Map と HashMap を両方importする理由
インターフェースと実装クラスは別物です。受け口を広く、実体を具体的にという原則を扱います。
エラーメッセージの読み方
Main.java:5: error: cannot find symbol
Main.java- ファイル名
5- 行番号 — javacが異常に気づいた位置。原因の行とは限りません
error- 種別 — コンパイルエラー。実行まで到達しません
cannot find symbol- 内容 — javacが期待していたもの、または見つけられなかったもの
このエラーが出る典型パターン
パターン1
1 import java.util.List ; ^ 2 3 public class Main { 4 public static void main(String[] args) { 5 Map<String, Integer> m = new HashMap<>(); 6 m.put("a", 1); 7 System.out.println(m.get("a")); 8 } 9 }
Main.java:5: error: cannot find symbol
symbol: class Map
MapとHashMapは別クラスなので両方importが要ります。java.util.* でまとめて取り込めます。
直し方: List を * にします。
広告
広告スロット(未設定)
パターン2
1 import java.util.ArrayList; 2 import java.util.List; 3 4 public class Main { 5 public static void main(String[] args) { 6 List<String> list = new List <>(); ^ 7 list.add("a"); 8 System.out.println(list); 9 } 10 }
Main.java:6: error: List is abstract; cannot be instantiated
Listはインターフェースなのでnewできません。受け口をインターフェース、実体を具象クラスにするのが定石です。
直し方: List を ArrayList にします。
パターン3
1 import java.util.*; 2 3 public class Main { 4 public static void main(String[] args) { 5 Map<String, List<Integer>> m = new HashMap<>(); 6 m.put("a", new ArrayList() ); ^ 7 System.out.println(m); 8 } 9 }
警告: unchecked conversion(コンパイルは通りますが型安全が失われます)
ダイヤモンド演算子を省くと生の型になり、型チェックが効かなくなります。<> を書くのが基本です。
直し方: new ArrayList() を new ArrayList<>() にします。
よくある誤解
IDEの自動importがHashMapだけを足すことがあります。Mapが足りないまま残るので、エラーが消えません。
まとめ
Map と HashMap を両方importする理由は上級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。