生成と拡張と箱詰め

Javaの新しい言語仕様の試しの続き。前回のをちょっといじってみた。Genericsと拡張forループ、Boxingは、セットって感じ。

Generics

Genericsは、C++のテンプレート機能ってことで、そっちはちょっとしかかじったことがなかった。

Vector v = new Vector();

なんて書けば、中身が全部、IntegerのVectorになるってことね。キャストがいらないのは便利だね。
Mapを見ていて、型が2つ指定される場合や、入れ子になっている宣言を見つけた。まぁ、こういうのも現れるわな。戻り値の宣言も、生成時の型に依存するってのは、新鮮な気付きだなぁ。

Interface Map
Set> entrySet()
public V get(Object key)

拡張forループ

while文とfor文の間の子のような感じ。for-eachの処理。vの中身が全部int、という宣言が出来ないと、これって書けないものね。vは、Vectorだったり、配列だったりするけど、場合わけして処理しているのかね。

for( int i: v ) {
...
}

こういう書き方はEclipseにType mismatchと言われた。なんか、使い方を間違っているのかな。

HashMap m = new HashMap();
...
for( Map.Entry e: m.entrySet() ) {
...
}

AutoboxingとUnboxing

Autoboxingは、ラッパークラスでラップする処理を自動的にやってくれるってのね。Integerとか、ラッパークラスの存在理由を説明するのは、今後は、とても難しくなりそう。ラッパークラスを使わないといけない、っていう状況はどういうときがあるんだろう。すぐに思いつかないのはマズイかなぁ。

v.add( 101 );
v.add( 301 );
v.add( 201 );

Unboxingは、Autoboxingの逆で、ラッパークラスから、プリミティブ型のデータを取り出す方。拡張forループって、Unboxingを使っているんだと思うけど、違うんだろうか。

ところで、

Integer型のインスタンスを2つ使って、演算したらBoxingされるのか試してみた。

Integer i = new Integer(2), j = 5;
i = i + 3;
int k = i + j;

期待したとおり、Boxingが利く。これって、単にEoDのために、Boxingの機能が追加された、なんて次元の変更じゃないような気がする。プリミティブ型とラッパークラスの区別がなくなったってことだ。Static Importもあるから、事実上、クラスに従属しないstaticメソッドはどこにあっても構わない。
Genericsなんか問題にならないくらい、根本的に言語仕様が変わった、ってことだ。もういっそう、メソッドなんか、クラス名なしで宣言するとパッケージに従属することにして、パッケージをStatic Importしたらどうだろう。なんか最初のコンセプトが破綻してるなぁ。

書き直し

この前書いた習作プログラムをちょっと直してみた。SortメソッドでStatic Importを使っている。

import java.util.Vector;

import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;

import static javax.swing.WindowConstants.*;
import static java.util.Collections.*;

public class test {

	public static void main(String[] args) {
		test t = new test();
	}

	public test() {
		JFrame frame = new JFrame( "Hello World" );
		frame.setDefaultCloseOperation( DISPOSE_ON_CLOSE );

		Vector v = new Vector();
		v.add( 101 );
		v.add( 301 );
		v.add( 201 );

		sort( v );
		
		DefaultListModel model = new DefaultListModel();
		for( int i: v ) {
			model.addElement( i );
		}
		
		JList list = new JList( model );
		frame.getContentPane().add( list );
		frame.setBounds( 100, 100, 200, 100 );
		frame.setVisible( true );
	}
}

後は、EnumVarargsの使い方がわかれば、5.0の言語仕様は、一通り、試したことになる。Genericsを使ったクラスを定義するってのは、やってないか。なんか、おもちゃプログラムを作りますかね。