生成と拡張と箱詰め
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 ); Vectorv = 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 ); } }();
後は、EnumとVarargsの使い方がわかれば、5.0の言語仕様は、一通り、試したことになる。Genericsを使ったクラスを定義するってのは、やってないか。なんか、おもちゃプログラムを作りますかね。