import java.util.Collection; import java.util.Collections; class IDEABug { static class ClassA { static <T> void sayHello(Collection<? extends T> msg) {} } static class ClassB extends ClassA { <error descr="'sayHello(Collection<? extends T>)' in 'IDEABug.ClassB' clashes with 'sayHello(Collection<? extends T>)' in 'IDEABug.ClassA'; both methods have same erasure, yet neither hides the other">static <T extends String> void sayHello(Collection<? extends T> msg)</error> {} } public static void main(String[] args) { ClassB.sayHello(Collections.<String>emptyList()); } }