Javaで「ArrayList keywords = new ArrayList();」に警告が出る理由とその対処法
こんにちは。ゆうせいです。
Javaでプログラムを書いていると、型に関する警告(raw型に関する警告)が出ることがあります。今回の宣言もその一例です。
警告の原因:「生(raw)型」の使用
まず、あなたのコードはこうなっています:
ArrayList<String> keywords = new ArrayList();
一見問題なさそうに見えますが、ここに潜む落とし穴があります。それは右辺の「new ArrayList()」にジェネリクス(Generics)が指定されていないことです。
Generics(ジェネリクス)とは?
Javaでは型の安全性を高めるために、リストやマップなどのコレクションに「どんな型のデータを入れるのか」を明示する仕組みがあります。これをジェネリクスと呼びます。
たとえば:
ArrayList<String> list = new ArrayList<String>();
このように書けば、「このリストにはStringだけが入るよ!」と明言しています。
生型(raw type)とは?
new ArrayList()
のように 型を省略して書くことを「生型(raw type)」と言います。
これは、古いバージョンのJava(Generics導入以前のJava 1.4など)との互換性のために残っている書き方ですが、現在では推奨されません。
なぜ推奨されないのか?
たとえば、以下のようなコードを書いてもコンパイルは通ってしまいます:
ArrayList keywords = new ArrayList(); // 生型
keywords.add(123); // 整数を追加
でも、これを取り出して String
として扱おうとすると…
String word = (String) keywords.get(0); // 実行時エラー!
実行時にClassCastExceptionが発生してしまう可能性があります。
警告メッセージの例
Javaコンパイラ(例えばjavac
)は、以下のような警告を出します:
Note: Test.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
これは「ジェネリクスの型チェックができない操作が含まれているよ」という警告です。
解決方法:右辺にも型をつけよう!
正しい書き方はこうです:
ArrayList<String> keywords = new ArrayList<String>();
または、Java 7以降では「ダイヤモンド演算子(<>)」を使って省略することも可能です:
ArrayList<String> keywords = new ArrayList<>();
どちらでもコンパイラの警告は出なくなります。
比較まとめ表
書き方 | 型安全性 | 警告の有無 | おすすめ度 |
---|---|---|---|
new ArrayList() | 低い | 出る | × |
new ArrayList<String>() | 高い | 出ない | ○ |
new ArrayList<>() (Java7+) | 高い | 出ない | ◎ |
今後の学習の指針
今後は、「右辺の型も省略せずに書く」または「ダイヤモンド演算子を使う」という習慣を身につけましょう。さらに、以下のトピックも学ぶと理解が深まります:
- ジェネリクスの基本構文と制約
- ワイルドカード(
?
の使い方) - 型消去(type erasure)の仕組み
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
