上限境界と下限境界を持つワイルドカード

自分めも。

Javaワイルドカードは? extends Hogeとか? super Fooとか書けるけど、? extends Hoge super Fooとは書けない。その前提でモデリングしてたらめんどくさいパターンを思いついた。

public class DualBounded {
    private interface UpperBounded<T extends JComponent> {
        T get();
        void set(T value);
    }
    void test(UpperBounded<? super JPanel> bounded) {
        // ok.
        JComponent component = bounded.get();
        bounded.set(new JPanel());
    }
}

引数のUpperBounded.Tに対して上限境界(extends JComponent)を指定しておいて、型引数のUpperBounded.Tには下限境界を持つワイルドカード(? super JPanel)を指定しておく。こうすると、このワイルドカードで指定した範囲は上限境界と下限境界を同時に持つ(? extends JComponent super JPanel)となる。

UpperBounded.Tのextendsを外したり、UpperBoundedのsuperを外したりすると、testメソッドはコンパイルエラーに。

両側の境界を持ってるようなワイルドカードは、直接表記はできないけど内部的にはいくらでも出現するぽい。

追記:

「両側の境界を持ってるようなワイルドカード」をモデリングする必要はなくて、そのワイルドカードに捕捉変換を適用した結果として「両側の境界を持ってるような型変数」があればいいのかな。