Following is a static function code snippet
   public static void safeIterate(Iterable<? extends CombatComponent> iterable, Consumer<? extends CombatComponent> consumer) {
        Iterator<? extends CombatComponent> iterator = iterable.iterator();
        while (iterator.hasNext()) {
            consumer.accept(iterator.next());
        }
    }
such code snippet could not compile successfully unless I change the second function parameter to  Consumer<CombatComponent> consumer, which confused me a lot.
 
    