import java.util.*; class GenericsTest { static S next(GenericsTest test) { System.out.println(test); return null; } public Iterator iterator() { return new Iterator() { @Override public boolean hasNext() { return false; } @Override public T next() { return GenericsTest.next(GenericsTest.this); } @Override public void remove() { } }; } } class GenericsTest1 { static S next1(GenericsTest1 test) { System.out.println(test); return null; } public Iterator iterator() { return new Iterator() { @Override public boolean hasNext() { return false; } @Override public T next() { return GenericsTest1.next1(GenericsTest1.this); } @Override public void remove() { } }; } } class GenericsTest2 { static S next2(GenericsTest2 test) { System.out.println(test); return null; } public Iterator iterator() { return new Iterator() { @Override public boolean hasNext() { return false; } @Override public T next() { return next2(GenericsTest2.this); } @Override public void remove() { } }; } }