import java.util.Iterator; class A implements Iterator<String> { private Iterator<String> other; public boolean hasNext() { boolean b = false; b = next() != null; // Noncompliant [[sc=9;ec=13]] {{Refactor the implementation of this "Iterator.hasNext()" method to not call "Iterator.next()".}} b = this.next() != null; // Noncompliant b = other.next() != null; b = next("a") != null; b = otherMethod() != null; return true; } public boolean hasNext(String x) { return next() != null; } public void remove() {} public String next() { return "a"; } public String next(String a) { return "a"; } public String otherMethod() {} } // Not Iterator class B { private A iterator; public boolean hasNext() { boolean b = false; b = next() != null; b = iterator.next() != null; return true; } public String next() { return "a"; } public void remove() {} } class C implements Iterator<String> { public boolean hasNext() { return true; } public String next() { return "a"; } public void remove() {} } class D extends C { public boolean hasNext() { boolean b = false; b = next() != null; // Noncompliant return true; } } class E extends C { public boolean hasNext() { class Internal extends C { public void myMethod() { next(); } } return true; } } abstract class F implements Iterator<String> { public abstract boolean hasNext(); public String next() { return "a"; } public void remove() {} }