jdk5 ジェネリック
2006/10/28
2008/08/04
java
プログラミング言語は進化しています。現場では、古いバージョンを使って開発しなければいけなくても、プログラミング言語は勝手に先にいってしまいます。
以前作成したプログラムをJDK5にしてみました。
JDK5が世にでて結構時間がたってしまいいまさらながらなのですが、
作成してびっくりしたことのひとつはキャストせずにすむことと、コンパイラできちんとあやまった型を使用するとおこってくれることでした。
ちょっとわかりずらい例ですが、
JDK5よりまえのコードでは
JButton button = (JButton)findComponent(container, "btn", JButton.clas);
というふうに使用していましたが、
JButton button = findComponent(container, "btn", JButton.clas);
というふうに使えるうえに、
JTextField txt = findComponent(container, "btn", JButton.clas);
というふうに使用しようとすると、JtextFieldとJButttonが違うとコンパイラが注意してくれます。
身近に注意してくれるコンパイラがいるとうれしくなりますね。
以前作成したプログラムをJDK5にしてみました。
シナリオ:コンテナから指定された名前、型のコンポーネントをみつける
public static <K extends Component> K findComponent(Container container,
String name, Class<K> k) {
Component[] components = container.getComponents();
for (Component component : components) {
if (component instanceof Container) {
K findComponent = findComponent((Container) component, name, k);
if (findComponent != null)
return findComponent;
}
if (k.isInstance(component) & eq(component.getName(), name))
return k.cast(component);
}
return null;
}
String name, Class<K> k) {
Component[] components = container.getComponents();
for (Component component : components) {
if (component instanceof Container) {
K findComponent = findComponent((Container) component, name, k);
if (findComponent != null)
return findComponent;
}
if (k.isInstance(component) & eq(component.getName(), name))
return k.cast(component);
}
return null;
}
JDK5が世にでて結構時間がたってしまいいまさらながらなのですが、
作成してびっくりしたことのひとつはキャストせずにすむことと、コンパイラできちんとあやまった型を使用するとおこってくれることでした。
ちょっとわかりずらい例ですが、
JDK5よりまえのコードでは
JButton button = (JButton)findComponent(container, "btn", JButton.clas);
というふうに使用していましたが、
JButton button = findComponent(container, "btn", JButton.clas);
というふうに使えるうえに、
JTextField txt = findComponent(container, "btn", JButton.clas);
というふうに使用しようとすると、JtextFieldとJButttonが違うとコンパイラが注意してくれます。
身近に注意してくれるコンパイラがいるとうれしくなりますね。
: