Code Fix

上級

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できません。受け口をインターフェース、実体を具象クラスにするのが定石です。

直し方: ListArrayList にします。

この問題を解いてみる →

パターン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パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)