*警告:[unchecked] raw 型 java.util.ArrayList のメンバとしての add(E) への無検査呼び出しです
DeleteStockData.java:81: 警告:[unchecked] raw 型 java.util.ArrayList のメンバとしての add(E) への無検査呼び出しです。 errorMessages.add("指定されたディレクトリが存在しません。存在するディレクトリを指定してください。"); DeleteStockData.java:90: 警告:[unchecked] raw 型 java.util.ArrayList のメンバとしての add(E) への無検査呼び出しです。 errorMessages.add("本日からの範囲を日数で指定してください。日数は半角数字のみで自然数のみを入力してください。"); DeleteStockData.java:98: 警告:[unchecked] raw 型 java.util.ArrayList のメンバとしての <T>toArray(T[]) への無検査呼び出しです。 this.errorMessage_ = (String[])errorMessages.toArray(new String[0]);
「無検査呼び出し」とは何か
JDK 5.0のクラス・ライブラリに含まれる List はジェネリックな List なので、要素の型が指定されていないプログラムをコンパイルすると、上記のような「無検査呼び出し」という警告が出る。
http://www.itarchitect.jp/technology_and_programming/-/18161-6.html
この警告は、型の安全性が保証されていないという意味だ。この警告が出る部分を Generics に対応させていけば、型に関して安全なプログラムに改良することができる。
要するに、Java 1.5 以降に実装された仕様のひとつである。
Java 1.5 以前では、動的に変更できる配列に代入される値の型を指定しなくても、問題なく利用できていた。しかし、型の安全性を保障するために、明示的に型を指定するという仕様に変更された。
エラーが出たソース
private Boolean validateArguments(String[] args) { Boolean isValidation = true; ArrayList errorMessages = new ArrayList(); for (int i = 0; i < args.length; i++) { switch (i) { case 0: File is_dir = new File(args[i]); if (is_dir.exists() == false) { isValidation = false; errorMessages.add("指定されたディレクトリが存在しません。存在するディレクトリを指定してください。"); } break; case 1: Pattern pattern = Pattern.compile("^[0-9]{1,}$"); Matcher matcher = pattern.matcher(args[i]); Boolean isMatch = matcher.matches(); if (isMatch == false) { isValidation = false; errorMessages.add("本日からの範囲を日数で指定してください。日数は半角数字のみで自然数のみを入力してください。"); } break; default: break; } } this.errorMessage_ = (String[])errorMessages.toArray(new String[0]); return isValidation; }
修正後のソース
private Boolean validateArguments(String[] args) { Boolean isValidation = true; ArrayList<String> errorMessages = new ArrayList<String>(); for (int i = 0; i < args.length; i++) { switch (i) { case 0: File is_dir = new File(args[i]); if (is_dir.exists() == false) { isValidation = false; errorMessages.add("指定されたディレクトリが存在しません。存在するディレクトリを指定してください。"); } break; case 1: Pattern pattern = Pattern.compile("^[0-9]{1,}$"); Matcher matcher = pattern.matcher(args[i]); Boolean isMatch = matcher.matches(); if (isMatch == false) { isValidation = false; errorMessages.add("本日からの範囲を日数で指定してください。日数は半角数字のみで自然数のみを入力してください。"); } break; default: break; } } this.errorMessage_ = errorMessages.toArray(new String[0]); return isValidation; }
変更点の比較
// 3行目。 // 修正前。 ArrayList errorMessages = new ArrayList(); // 修正後。型宣言の直後に代入される値の型を明示する。 ArrayList<String> errorMessages = new ArrayList<String>(); // 27行目。 // 修正前。 this.errorMessage_ = (String[])errorMessages.toArray(new String[0]); // 修正後。型キャストを削除する。 this.errorMessage_ = errorMessages.toArray(new String[0]);