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());
}
}