ひがやすを技術ブログ

電通国際情報サービスのプログラマ

clazz.getAnnotation(Xxx.class)はキャストする必要がある?

パラメータとして渡しているその当のクラスにキャストするところが何か「変な感じ」がしたのがだが、戻り値は1つの型に固定される(戻り値のオーバーロードはないというコト)のでインターフェイスの Annotation でしかしょうがなく、受ける変数の型の方が勝手に対応してくれるハズもないので、プログラマが明示的に「キャスト」するしかない。


private String findTableNameFromModelAnnotation(Class clazz){
String foundTableName = "";
assert clazz.isAnnotationPresent(Table.class);
Table annotaion = (Table)clazz.getAnnotation(Table.class);
foundTableName = annotaion.name();
return foundTableName;
}

とはいえ、「プログラミング言語」の方を融通良くすることで何とかならないものなのかな?と少し考えてみた。すると、このような「思考」も結構楽しいものだと、少しまつもとひろゆきの気持ちが少しわかった気がした。

clazzパラメータの型をClass<?>にするとキャストする必要はありません。こうかけます。


private String findTableNameFromModelAnnotation(Class<?> clazz) {
...
Table annotaion = clazz.getAnnotation(Table.class);
Java5以降は、Classの原型を使う意味は余りないと思いますよ。Eclipseを使っているなら、Classの原型を使ったときに、警告を出すように設定できるので、Eclipseにチェックしてもらったほうがいいです。