TOP > プログラマ2.0日報 > オブジェクトじゃないのに.....

あすなろBlogger

facebookに投稿 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク このエントリーをはてなブックマークに追加 この記事をクリップ! livedoorclip ユーザー数 BuzzurlにブックマークBuzzurlにブックマーク この記事をtweetする

オブジェクトじゃないのに.....

2008.04.13

ちょっと遊びで書いているプログラムで、 Javaのリフレクションに関して

意外な書き方...

で?となったことがあります。それはですね、

java.lang.reflect.Method#getReturnType()

などの戻り値は、java.lang.Class なのですけども、このメソッドがたとえば、

public String getMessage() { ..... }

をリフレクトして java.lang.String を戻り値の Class として返すので、

if( String.class.equals(method.getReturnType()) {

と判定するのは勿論文句はありません。しかし、この method が、

public int getInt() { .... }
public double [] getDoubles() { ... }

をリフレクトするんだったら....となると、結構アレ?となるような書き方をしないといけません!

正解は、

if( int.class.equals(method.getReturnType()) ) {
} else if(double[].class.equals(method.getReturnType()) {

といった書き方です。ちょっと気味が悪いですね....

というのは、 Java の原理として、

int はオブジェクトではない!

という大原則があるのですが、このリフレクションの場合では、

オブジェクトだろうがプリミティブ型だろうが配列だろうが「統一的に」取り扱えなくてはならない!という事情で

int.class, double[].class

といったエキストラな書き方が導入された模様です。この書き方は、実は「classプロパティの参照」ではなくて、「int.class」という特別なリテラルだ、ということです....まあ、 Class#getMethod() するケースでの引数指定では、 java.lang.Integer で渡しちゃって全然問題がないので、これ気づきにくいんですよね....

まあ、Java というときちんとしているようで結構アバウトなところがありますから、こういうエキストラな書き方をこっそり導入したのかもしれませんね!(「リテラルだ!」と強弁するあたり、後付けっぽいですね、苦笑)

参考:JavaHouse「プリミティブ型の値をオブジェクトとして扱うには?」


投稿者 : 杉浦 こずえ | 投稿日時 : 2008.04.13 21:26

あすなろBLOGのトラックバック・コメントは承認制になっています。
すぐにブログに反映されませんので、ご了承ください。

トラックバックURL


コメントの送信








カレンダー

<< 2008年04月 >>

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      

最新のエントリー

最新のトラックバック

最新のコメント

Tag

バックナンバー