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)の仕組み

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。