marsさんとこにあった「Genericsの奥深さをちょっと覗いてみたよ」が、おもしろい。
Generic methodの型パラメータを、throws節にバインドできるとは知らなかった。肝は、
static void rethrowAny(Throwable t) {
RethrowDemo.<RuntimeException>rethrowInternal(t);
}
@SuppressWarnings("unchecked")
static <T extends Throwable>: void rethrowInternal(Throwable t) throws T {
throw (T) t;
}
かな。チェック例外への対処はコンパイル時に行われるから、Genericsを使って「これはRuntimeExceptionだからね〜」とだまして、InterruptedExceptionを渡す。throw (T) t;のキャストは、所詮はイレージャだから、コンパイル時のチェックのみで、実行時には消えてなくなってしまい、別にcheckcastされるわけではない。かくして、throws節無しで、チェック例外がスローできてしまうわけだ。
トラックバック[0]
コメント[0]
投稿者 shanai : 2008/05/15 0:28:59 JST








