クイズ

class A<T> extends B<T,B<T,A<T>>> { }
class B<T,S> { }
class C<T extends A<A<T>>, S extends A<A<A<S>>>> {
    <T> T lub(T x, T y) { return x; }
    A<T> x = lub(new A<T>(), new A<S>());
}

上のプログラムを javac に食わせると何が起こるでしょうか。

  1. 構文エラーが報告される
  2. 型エラーが報告される
  3. その他

それでは、次のプログラムではどうでしょうか。

class A<T> extends B<A<B<T>>> { }
class B<T> { }
class C<T,S> {
    <T> T lub(T x, T y) { return x; }
    A<?> x = lub(new A<T>(), new A<S>());
}


答え。最初のやつは 2、次のは 3(止まらない*1)でした。ただし、javac のバージョンによっては結果が異なる場合がありますのでご了承ください。

*1:実際には有限時間のうちにヒープかスタックを使い果たすと思うが、あまりに変化が遅いので確認できなかった。