Futureスマートフォン用の表示で見るスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。Future何かを始めたら、半分成功したのと同じ2008-08-06君は合成メソッドを知っているか!(Java)pg僕は知らなかった。出会いS2のBeanDescImpl*1クラスを読んでいたらこういうソースがあった。...Bridge??Synthetic??J2SE1.5から!?で、MethodUtil*2のメソッドはこれ。}リフレクションのMethodクラスにisSynthetic、isBridgeメソッドがあるか調べてる。そんなメソッドあったっけ。ある!しかもJ2SEの1.5から!http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/reflect/Method.html#isBridge()橋渡し役のメソッド?合成メソッド?謎が深まる。共変戻り値の実装にかかわっていたこの2つのメソッドはJ2SE1.5から導入された、共変戻り値にかかわっていた。(共変戻り値はなんとか知ってたぜ!)共変戻り値とは単純に言うと、オーバーライドするときに、スーパークラスで定義した戻り値の型のサブクラスの型を、オーバーライドしたメソッドで定義すること。Integer.valueOf(0);}}インタフェースで定義したメソッドvalue()の戻り値はNumber。それを実装したクラスでは戻り値をNumberのサブクラスであるIntegerで定義する。コンパイルも実行も例外なくできる。合成メソッドって?こういう共変戻り値を使ったときなど、コンパイラが自動的にメソッドを作成することがあるらしい。この自動的に作成したメソッドを合成メソッドという。共変戻り値を使ったときは、スーパークラスと同じ戻り値の型のメソッド(今までのオーバーライドのイメージ)がコンパイラによって作られる(戻り値の型を変えて実装したメソッドとは別に)。共変戻り値での合成メソッドは、内部的には新たに戻り値の型を変えたメソッドに処理を委譲する、という実装になっている。!こうして共変戻り値を実現しているんだ!非常に納得。最後にコードで実証では本当に合成メソッドが作られているか、確認。リフレクションを使う。さっきの2つのクラスで。method.isBridge());}}実行するとこんな出力。ReturnInteger.value()isSynthetic:trueisBridge:true...(volatileはsynchronizedのゆるいのやつね。)たしかにvalue()メソッドが2つあり、インタフェースで定義した方はisSynthetic()もisBridge()もtrueを返してる。Javaで知らないことがたくさんあるんだな。»プロフィールid:jyukutyo元アルバイト塾講師なソフトウェアエンジニアです。京都にあるモバイル系企業で働いています。Blog|ブログを報告する。