投稿

Javaのクロージャをいじってみた。(8)

何か、closureの引数でワイルドカード使うとエラーになる。 詳しく調べてないけど、以下のコードはエラーになった。 (BGGA 2008-08-11版のclosure.jarでやってエラーになった)  // × コンパイルエラー  // "? supre T"の周辺で6つぐらいエラーが出る。  public Integer calc({? super T,Integer} func) {   // ありゃエラーになる。  }  // ○ コンパイル/実行可能  public Integer calc(Function<? super T,Integer> func) {   // これはOK  } んー これは何か理由あっての制限なのかな。 それともこのバージョンは未完のためエラーになってしまうのかな。 英語だからってBGGAのページのドキュメントを読むのサボったから 見落としたのかな...。汗    

Java Genericsが難しい(5.1)

ジェネリクスと配列の組み合わせは相性が悪い。 という件は、2007年のJavaOneのセッション「Effective Java Reloaded: This Time It's Not for Real」で言ってるね。 ちゃんと読み直せばO'Reillyの「Java Generics and Collections」にも 書いてあるかも。    

Java Genericsが難しい(5)

ジェネリクスと配列の組み合わせは相性が悪い。 大抵のコードはエラーになる。色々調べたが、そういうものらしい。 それでも納得いかないコードもある。 ArrayList<string>[] = new ArrayList<string>[]; これもエラーになる。これはあんまりだと思う。 これはコンパイル通っていいんじゃない? 次のバージョンでコンパイル通るよう、直すべきだー。 そんなある日、ClassのAPI見てて気づいたのだけど、 Class#getClasses()の戻り値はClass<?>[]なのよ。 つまり、"ArrayList<string>[] ="の部分は問題ないと。 そこで思いついたのが、effective java second editionの手法や、 Google CollectionsのListsやMapsクラスの手法をちっと拡張した 生成用補助メソッド。 但し、ジェネリクスと配列の組み合わせでどうしてもワーニングが発生する。 そこはあきらめ、少なくとも@SuppressWarnings("unchecked")を書くコードと 書かないコードを切り分ける。 書かざるを得ないなら、コードに散在させず、まとめておく。 で作ったのがこれ。 // 定義側 public class ArrayUtils {   ;  @SuppressWarnings("unchecked")  private static <T> LinkedList<T>[] newLinkedListArray(int size) {   return new LinkedList[size];  }   ; } // 利用側 public class Main {   public static void main(String... args) {    ArrayList<Integer>[] temp = ArrayUtils.newArrayLists();    temp[1] = new ArrayList<Integer>();    temp[2] = new ArrayList<Integer>...

「日本語版Effective Java 第2版」のAmazon予約開始

訳者の柴田 芳樹氏のブログによると「日本語版Effective Java 第2版」が Amazonで予約可能になったようですね。 予約すべきか、Sun Tech Daysでやるかもしれない会場販売で買うべきか (オマケ期待)。 ううむ… あと、値段思ったより安いのね。ずいぶん厚くなったから4000円越えると 思ってた。 円高のおかげ?関係ねぇか。    

Arrays.asList()のジェネリクスの仕組み

以前、 ジェネリクスについて書いた とき、引数型に(T...)を利用するのは 相性悪いと書いた。 このときは、引数型(T...)を持つ、インタフェースを継承し利用したときを 例にした。 でも、JavaPlatformAPIの中にはArrays.asList(T... t)というメソッドもあった。 そこで、OpenJDKを開いてasList()のソースを調べてみた。 public static <T> List<T> asList(T... a) {   return new ArrayList<T>(a); } あれ?配列受け取る引数のコンストラクタなんてArrayList持ってたっけ? と思ったらArraysコード内で同名の実装クラスを持ってった。 おおう。 List<T>が戻り値なのでこれを満たせば十分と。 なるほど。 このクラスの中身を見たところ、ジェネリクス配列そのものを内部に持ち、 単純なラッパークラスでした。 ArrayList<T>の様なコンテナとしての利用はOKでComparator<T>みたな 継承前提インタフェースでの引数型に(T...)を利用するのはアウトということか? ふうむ... 余談ですが、Arrays.asList()の利用方法は、可変長引数からListクラスを 作るだけでなく、配列のラッパークラス生成の便利メソッドとしての 利用もよさそう。    

きました。

イメージ
RRoD。 これが出てやっと一人前の360ユーザー。   とはいえ、 来週、大規模アップデートあるのにこの時期はねーだろ。ヽ(`Д´)ノ ところでこの写真、HAL9000ぽく撮れてたんだけどかっこよくね?    

Javaのリフレクションの勉強

私はJavaの基本機能は一通りは理解していると思っていたのですが、 最近、理解していないことが沢山あることに気づきました。 とりあえず、理解不足が集中しているのがリフレクション・クラスロード関連・ あとシリアライズ関連。わんくま同盟の方のblogを見てまだまだ知らないことが 沢山有ることを知り猛省。 リフレクションについては、アノテーション関連で必須になるので理解して おかないとなあ。 インナークラスから、エンクロージングクラスの参照(this)取得する方法とか つい先日知ったよ! .thisだって! へー。   そんなレベル。