Java 8

public class Java8Puzzle {

    interface IObject<T> {
        T getResource();
    }

    interface IHandle<R extends IObject<?>> {
        R getObject();
    }

    public Collection<IHandle<?>> getHandles() {
        return null;
    }

    public Collection<IHandle<? extends IObject<?>>> getHandles2() {
        return null;
    }

    public <R extends IObject<?>> List<R> get(final Collection<IHandle<? extends R>> handles) {
        return null;
    }

    public void main(String[] args) {
        Java8Puzzle test = new Java8Puzzle();

        // Doesn't compile
        List<? extends IObject<?>> r = test.get(test.getHandles());
        //                                  ^^^
        // The method get(Collection<Java8Puzzle.IHandle<? extends R>>) in the type
        // Java8Puzzle is not applicable for the arguments (Collection<Java8Puzzle.IHandle<?>>)

        // Compiles
        List<? extends IObject<?>> r2 = test.get(test.getHandles2());
    }

}