ひとりでできる Java 実践入門

サポートページ

この記事を読むのに必要な時間:およそ 0.5 分

補足情報

Java 2 SDK バージョン5.0をご使用時の留意事項

Java 2 SDK バージョン5.0(1.5.0)では,新たに型安全性のための「型チェックの技法」が導入されています。この新しい機能は,従来のJava 2 SDK 1.4.XベースのCollectionsフレームワークの機能と整合しません。このため,Java 2 SDK 1.4.XベースのCollectionsフレームワークの機能を使っている従来のJavaプログラムをJava 2 SDK バージョン5.0の新しいコンパイラを使ってコンパイルすると,次のようなメッセージが表示されます。

d:\work>javac MyNewJava.java

注:MyNewJava.java の操作は,未チェックまたは安全ではありません。

注:詳細については, -Xlint:unchecked オプションを指定して再コンパイルして下さい。

このメッセージはエラーメッセージではなく警告メッセージであることに留意してください。この場合,Java 2 SDK 1.4.Xベースのプログラムとして問題がなければ,従来通りクラスファイル(このケースでは,MyNewJava.classファイル)は生成され,また,JREバージョン5.0の環境で実行することができます。

プログラムをJava 2 SDK バージョン5.0に対応した「型安全なコード」にするためには,別途,ソースコードをバージョン5.0用に手直ししなければなりません。次に,バージョン5.0ではいったいどのような手直しが必要になるのか,Sample List 6-4の手直し事例を紹介しておきます。

Java 2 SDK 1.4.XベースのCollectionsフレームワークの機能を使った従来のプログラム

−Sample List 6-4 Vectorクラスを使うプログラム−

import java.util.*;
public class MyNewJava {
public static void main(String args[]) {
String[] animals = {"ライオン", "チーター", "サル", "トラ", "ウマ",
"ゾウ", "キリン"};
int intarray[] = {100, 300, 400, 400, 500, 600, 700};
// 配列animalsの内容を表示する
for (int i = 0; i < animals.length; i++)
System.out.print(animals[i] + " ");
System.out.println();
// 配列intarrayの内容を表示する
for (int i = 0; i < intarray.length; i++)
System.out.print(intarray[i] + " ");
System.out.println();
// 配列からVectorを作成する
Vector v1 = new Vector(Arrays.asList(animals));
// Vectorを作成する
Vector v2 = new Vector();
// int型のIntegerラッパクラスを使って要素を追加する
for (int i = 0; i < intarray.length; i++) {
v2.addElement(new Integer(intarray[i]));
}
// 「"ヒツジ"」オブジェクトを挿入する
v1.insertElementAt("ヒツジ", 3);
// 「"チーター"」オブジェクトを削除する
v1.removeElement("チーター");
// v1の要素を表示する
for (int i = 0; i < v1.size(); i++) {
System.out.print(v1.elementAt(i) + " ");
}
System.out.println();
// 値「200」のIntegerを挿入する
v2.insertElementAt(new Integer(200), 1);
// 値「400」のIntegerを削除する
v2.removeElement(new Integer(400));
// v2の要素を表示する
for (int i = 0; i < v2.size(); i++) {
System.out.print(v2.elementAt(i) + " ");
}
System.out.println();
// Collectionsクラスのsort()メソッドを使う
Collections.sort(v1);
// v1の要素を表示する
System.out.println(v1);
// サイズとキャパシティを表示する
System.out.println("v1のサイズ:" + v1.size());
System.out.println("v1のキャパシティ:" + v1.capacity());
System.out.println("v2のサイズ:" + v2.size());
System.out.println("v2のキャパシティ:" + v2.capacity());

}

}

Java 2 SDK 5.0ベースのCollectionsフレームワークの機能に対応したプログラム

−Sample List 6-4 Vectorクラスを使うプログラムの手直し事例−

import java.util.*;

public class MyNewJava { public static void main(String args[]) { String[] animals = {"ライオン", "チーター", "サル", "トラ", "ウマ", "ゾウ", "キリン"}; Integer intarray[] = {new Integer(100), new Integer(300), new Integer(400), new Integer(400), new Integer(500), new Integer(600), new Integer(700)}; // <--- 5.0用の変更 // 配列animalsの内容を表示する for (int i = 0; i < animals.length; i++) System.out.print(animals[i] + " "); System.out.println(); // 配列intarrayの内容を表示する for (int i = 0; i < intarray.length; i++) System.out.print(intarray[i] + " "); System.out.println(); // String型の配列からVectorを作成する Vector<String> v1 = new Vector<String>(Arrays.asList(animals)); // <--- 5.0用の変更 // Integer型の配列からVectorを作成する Vector<Integer> v2 = new Vector<Integer>(Arrays.asList(intarray)); // <--- 5.0用の変更 // 「"ヒツジ"」オブジェクトを挿入する v1.insertElementAt("ヒツジ", 3); // 「"チーター"」オブジェクトを削除する v1.removeElement("チーター"); // v1の要素を表示する for (int i = 0; i < v1.size(); i++) { System.out.print(v1.elementAt(i) + " "); } System.out.println(); // 値「200」のIntegerを挿入する v2.insertElementAt(new Integer(200), 1); // 値「400」のIntegerを削除する v2.removeElement(new Integer(400)); // v2の要素を表示する for (int i = 0; i < v2.size(); i++) { System.out.print(v2.elementAt(i) + " "); } System.out.println(); // Collectionsクラスのsort()メソッドを使う Collections.sort(v1); // v1の要素を表示する System.out.println(v1); // サイズとキャパシティを表示する System.out.println("v1のサイズ:" + v1.size()); System.out.println("v1のキャパシティ:" + v1.capacity()); System.out.println("v2のサイズ:" + v2.size()); System.out.println("v2のキャパシティ:" + v2.capacity()); } }
出力結果

ライオン チーター サル トラ ウマ ゾウ キリン 
100 300 400 400 500 600 700 
ライオン サル ヒツジ トラ ウマ ゾウ キリン 
100 200 300 400 500 600 700 
[ウマ, キリン, サル, ゾウ, トラ, ヒツジ, ライオン]
v1のサイズ:7
v1のキャパシティ:14
v2のサイズ:7
v2のキャパシティ:14

解説:

このケースでは,ArraysクラスのasList()クラスメソッドを使って,配列からStringクラス型のVectorオブジェクトとIntegerクラス型のVectorオブジェクトを作成しています。その場合,従来のようにオブジェクトの生成時に具体的な型が指定されていないと,後で型キャストを行わなければならず,また,そのような型キャストには間違いが起こりやすく安全ではありません。5.0はこのような安全でない従来用法を改善するために,「型チェック」の機能を導入しました。このため,5.0を使う場合は,Stringクラス型のVectorオブジェクトやIntegerクラス型のVectorオブジェクトを宣言,初期化する時点で,次のように,「<型>」の記述を添えて,オブジェクトの型を特定(Specialize)します。


// String型の配列からVectorを作成する
Vector<String> v1 = new
Vector<String>(Arrays.asList(animals));			// <--- 5.0用の変更
// Integer型の配列からVectorを作成する
Vector<Integer> v2 = new
Vector<Integer>(Arrays.asList(intarray));		// <--- 5.0用の変更
5.0では,オブジェクトの宣言,初期化の中で先にこのような「型の特定」を行うので,後続のオブジェクトを使った型用法の間違いを検出できるようになります。上記の手直し事例では,後続の記述がそのまま使えることにも留意してください。表面上は同じでも,5.0では,水面下で型チェックが行われるので「型安全」なプログラミングができるようになります。

追記:

5.0では,「型チェック技法」の導入に伴い,java.utilパッケージのCollectionsフレームワークに関連するほぼすべてのクラスの仕様が変更されています。5.0の新しいドキュメントでは,特に「<E>」の記述のあるクラスの取り扱いに注意してください。