finalでないprotectedフィールドの使い道

思いつきメモ。

class Hoge {
    static interface Expr {}
    static class Add implements Expr {
        protected Expr left;
        protected Expr right;
    }
    static class Sub implements Expr {
        protected Expr left;
        protected Expr right;
    }
    static class Value implements Expr {
        protected int value;
    }
    Add result = new Add() {{
        left = new Value() {{ value = 10; }};
        right = new Sub() {{
            left = new Value() {{ value = 7; }};
            right = new Value() {{ value = 3; }};
        }};
    }};
}

逆に読みにくいかも。

メソッド呼び出しの型推論を追いかける(前半)

メソッドの型推論エンジン作ってて、そのテストケースの洗い出し中。
Java言語仕様(第3版)の15.12.2.7 Inferring Type Arguments Based on Actual Argumentsを私なりに解説してみようと思います。理解してしまえば、そんな実装が難しいものではありません。

メソッドの型推論は主に次の2ステップからなります。

  1. 実引数と仮引数の制約から、型変数に対する制約を計算する
  2. 型変数に対する制約から、実際の型を推論する

(前半)では、前者の部分について追いかけてみます。言語仕様の和訳では、p.395〜p.405のあたりです。ちなみに、テストケース洗い出しのために網羅しているので、同じくらいの分量が平気であります。

続きを読む

SunのコンパイラとEclipse JDTで動きが違う(5)

今回はちょっと難易度高め。
メソッドの型推論にちょっとした穴を見つけたので動作確認してたら動きが異なりました。捕捉変換に関する覚え書き - しげるメモの概要をつかんでないと何言ってるか分からないかもしれません。

続きを読む

捕捉変換に関する覚え書き

まじめにJava型推論書いてるのでメモ。capture-#xとか分かるようになるかも。
レビューに付き合ってくださる方は Java SE Specifications からPDFをダウンロードしておくとよいかと*1

*1:リンク貼るのが面倒になった

続きを読む

型推論のちょっとしたこと

List<null>型を作れないか考えてて全然関係ないこと思いついた。

void f() {
    String a1 = id(null); // ok
    String a2 = id(id(null)); // error
    String a3 = id(a3 = id(null)); // ok
}
<T> T id(T t) {
    return t;
}

「制約 null << T のとき、Tに課せられる制約」を考えると理解できると思います。
同時に、List<null>型が作れないことが判明してがっかり。