型が合ったぁぁ

id:ashigeruさんからツッコミを貰いましてん。

つまり、こういう事らしい。

public interface A<L, R> {
  B<L, R> b();

  List<? extends B<L, R>> nestedb();
}

public interface NumberedA extends A<Integer, Long> {
  NumberedB b();

  List<NumberedB> nestedb();
}

そう、このNumberedAがやりたかった。

で、呼び出す側のコードはこんな感じ

public class Main {
  public void main(String[] args) {
    NumberedA np = null;

    NumberedB kids = np.b();
    B<Integer, Long> kids2 = np.b();

    List<NumberedB> fs2 = np.nestedb();
    List<? extends B<Integer, Long>> fs = np.nestedb();
  }
}

結局の所、

List<B<L, R>>

List<? extends B<L, R>>

には、明確な違いがあるって事らしい。
ぐぬ…よく分らんぞ。


もっかい、ちゃんとコンパイルが通るコード。

public interface A<L, R> {
  B<L, R> b();

  List<? extends B<L, R>> nestedb();
}

public interface NumberedA extends A<Integer, Long> {
  NumberedB b();

  List<NumberedB> nestedb();
}

b()は問題ナシ。nestedb()は、何で? extends Bにしないとダメなんだろ…。
うう…