Как всегда я просматривал источники JDK 8 и нашел очень интересный код:
@Override
default void forEachRemaining(Consumer<? super Integer> action) {
if (action instanceof IntConsumer) {
forEachRemaining((IntConsumer) action);
}
}
Возникает вопрос: каким образом Consumer<? super Integer>
может быть экземпляром IntConsumer
? Потому что они находятся в разных иерархиях.
Я сделал аналогичный фрагмент кода для тестирования кастинга:
public class InterfaceExample {
public static void main(String[] args) {
IntConsumer intConsumer = i -> { };
Consumer<Integer> a = (Consumer<Integer>) intConsumer;
a.accept(123);
}
}
Но он выбрасывает ClassCastException
:
Exception in thread "main"
java.lang.ClassCastException:
com.example.InterfaceExample$$Lambda$1/764977973
cannot be cast to
java.util.function.Consumer
Вы можете найти этот код на java.util.Spliterator.OfInt # forEachRemaining (java.util.function.Consumer)