/*
 * Sets up recursive bounds where the bounds themselves are type variables.
 */

interface MMyList<LL> {}

interface MMyMap<KEY, VALUE> {}

class Tester<EE extends TT, TT extends MMyList<EE>> {}

class WithWildcard<ZZ extends QQ, QQ extends YY, YY extends MMyMap<QQ, ZZ>> {
  void context() {
    ZZ zz = null;
    QQ qq = null;
    YY yy = null;
  }
}

class Test<KK extends FF, FF extends MMyMap<KK, KK>> {
  KK kk;
  FF ff;

  Test(KK kk, FF ff) {
    this.kk = kk;
    this.ff = ff;
  }
}

class RecursiveTypevarClass<T extends RecursiveTypevarClass<T>> {
  T t;

  RecursiveTypevarClass(T t) {
    this.t = t;
  }
}

class RecursiveImplements implements MMyList<RecursiveImplements> {}
