Annotation Processorで登場するUnionTypeとIntersectionType

Domaの注釈処理周辺でJava7/Java8対応がどの程度必要か調べている過程で、UnionTypeというものがすでにJava7で追加されていて、IntersectionTypeというものがJava8で追加される予定だということを知りました。

どちらもよくわからないので調べてみました。

UnionType

tryステートメントのところでこんなサンプルがありました。

try {
    ... throws ReflectiveOperationException ...
}
catch (ClassNotFoundException | IllegalAccessException ex) {
    ... body ...
}

そういえば、muliti-catchというものができるようになったんでしたっけ。

で合成された型をunionと呼んでいます。UnionTypeはこれに相当するのでしょう。


muliti-catch句の型にLOCAL_VARIABLEをターゲットとしたアノテーションを注釈可能ということは確認しました。
ですので、きっと、Annotation ProcessorではUnionTypeとして取得できるのだと思います(実際に取得できるかは未確認)。

@Target({ LOCAL_VARIABLE })
@Retention(RetentionPolicy.RUNTIME)
public @interface Hoge {}

...

try {
    ... throws ReflectiveOperationException ...
}
catch (@Hoge ClassNotFoundException | IllegalAccessException ex) {
    ... body ...
}

IntersectionType

こんなテストコード見つけました。

このテストケース、コンパイルエラーになるケースを意図的に入れているようなのですが、私の環境のJDK(lambda-8-b69)でコンパイルが通ったケースだけに絞ると以下のものです。

class Intersection01 {

    interface SAM {
        void m();
    }

    Object o4 = (SAM & java.io.Serializable)Intersection01::m;

    static void m() { }
}

どうやら キャストの括弧の中で & を使って合成した型をintersection typeと呼ぶようです。

キャストの括弧の内側にTYPE_USEターゲットとしたアノテーションを注釈可能ということは確認しました(TYPE_USE もJava8で入るようです)。
きっと、Annotation ProcessorではIntersectionTypeとして取得できるのだと思います(実際に取得できるかは未確認)。

@Target({ TYPE_USE })
@Retention(RetentionPolicy.RUNTIME)
public @interface Hoge {}

class Intersection01 {

    interface SAM {
        void m();
    }

    Object o4 = (@Hoge SAM & java.io.Serializable)Intersection01::m;

    static void m() { }
}

まとめ

おそらく、Domaの互換性には影響しないと思います。
で、何か、機能拡張などに使えやしないだろうかと考えを巡らせてみたものの、何も使い道を思い浮かばず...