上限境界と下限境界を持つワイルドカード
自分めも。
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メソッドはコンパイルエラーに。
両側の境界を持ってるようなワイルドカードは、直接表記はできないけど内部的にはいくらでも出現するぽい。