У меня странное поведение двусмысленности Java-дженериков, которое я не могу объяснить:
Те 3 метода в классе:
public static <E extends ClassA & ClassB> void method(E val) {}
public static <E extends ClassC & ClassB & ClassA> void method(E val) {}
public static <E extends ClassB> void method(E val) {}
компилировать.
Но это не (нарушение двусмысленности):
public static <E extends ClassA & ClassB> void method(E val) {}
public static <E extends ClassB & ClassC & ClassA> void method(E val) {}
public static <E extends ClassB> void method(E val) {}
(ClassA, ClassB, ClassC - полностью независимые интерфейсы!)