Object#getClass()の戻り値を変数に入れる際、変数の型は何にすればいいか?
「Type obj」に対して「Class c = obj.getClass()」でいけるんだけど、JDK1.5以上ならジェネリクスの型情報が無いのは寂しい。
でも「Class<Type> c = obj.getClass()」はダメなんだよね。
「Class<Type> c = (Class<Type>)obj.getClass()」という風にキャストしてやれば動作はするが、コンパイル時に警告が出る。
で、正解は「Class<? extends Type> c = obj.getClass()」。
これで「Type t = c.newInstance()」という書き方も問題なく出来る。
(Typeにデフォルトコンストラクターが無いと実行時に例外発生となるが、それはまた別のお話)
で問題は、Object#getClass()の定義!
JRE1.5と1.6で異なっているけれども、いずれにしてもそれと同じ定義を自分で行った場合、上記の“正解”のようなコーディングは出来ない。
うーん、RuntimeExceptionと同じような、言語仕様上の特別扱いなんだろうか。
(RuntimeExceptionの派生クラスは、throwsに書くのを省略できる)