public class IterableGenerics {
  interface Data extends Iterable<String> {}

  <T extends Data> void typeParam(T t) {
    for (String s : t) {}
  }

  void wildcard(Iterable<? extends Data> t) {
    for (Object a : t.iterator().next()) {}
  }
}
