すぐに書くつもりが間が開いてしまいました。
誰が読むんだこんなマニアックな話題シリーズ第三部、完結編です。
わんくまではJavaはマイナーなのもあってか、単にマニアックすぎるのか、
このシリーズは非常にアクセス数が少ないです。ちょっと寂しいですね。
無名クラスでのジェネリクス
無名クラスの場合も
前回のローカル内部クラス
と基本的に一緒です。
public class Hoge<T> {
public static <X> void main(String[] args) {
// staticメソッド内での無名クラス
// staticメソッドなので型パラメータTは不可視なのでコンパイルエラーとなる
Comparable<T> comparableT = new Comparable<T>() { // NG!
@Override
public int compareTo(T o) {
return 0;
}
};
// メソッドのローカルな型パラメータXは可視なのでOK
Comparable<X> comparableX = new Comparable<X>() { // OK
@Override
public int compareTo(X o) {
return 0;
}
};
}
public void hoge() {
// インスタンスメソッド内での無名クラス
// インスタンスに関連づくのでクラスの型パラメータTを利用可能
Comparable<T> comparable = new Comparable<T>() { // OK
@Override
public int compareTo(T o) {
return 0;
}
};
}
}
staticメソッド内ではクラスの型パラメータは参照できず、
インスタンスメソッド内ではクラスの型パラメータが利用できます。
無名クラス内部では外側のスコープのfinalな変数を
参照することが出来ますが、staticメソッドの場合、
そもそもクラスの型パラメータを参照できないわけですから、矛盾しないわけですね。
まとめ
基本的には外側のクラスの変数などへの参照ができるケースでは外側の型パラメータも利用できます。
ただし、ハイディングを起こすので型パラメータの宣言には注意が必要です。
ジェネリクスを利用すると、型が違うけども同じ処理、といったコードをひとまとめにすることができます。
通常はクラスに型パラメータをつけて型安全の確保程度で終わるところですが、
ローカルな内部処理に内部クラスを利用すると、ジェネリクス指向をもっと活用することが出来ます。
ただでさえややこしいジェネリクスと、内部クラスを混合して使うのには訓練が必要ですが、
プログラミングとしてはとても面白い部分だと思います。是非、活用してみてください。
投稿日時 : 2007年8月15日 22:53