import java.io.Serializable; import java.util.ArrayList; import java.util.List; /** @noinspection UnusedDeclaration*/ class GenericsTest98 { public static void main(String[] args) throws Exception{ List<Movable<? extends Serializable>> list = new ArrayList<Movable<? extends Serializable>> (); Factory factory = Factory.newInstance(); // Doesn't compile, but Idea doesn't complain Mover<? extends Serializable> mover = factory.getNew<error descr="'getNew(java.util.List<? extends Movable<T>>)' in 'Factory' cannot be applied to '(java.util.List<Movable<? extends java.io.Serializable>>)'">(list)</error>; } } abstract class Factory { public static Factory newInstance(){ return null; } // This should actually be // public abstract <T extends Serializable> Mover<T> getNew (List<? extends Movable<? extends T>> source); public abstract <T extends Serializable> Mover<T> getNew (List<? extends Movable<T>> source); } /** @noinspection UnusedDeclaration*/ interface Movable<T extends Serializable> extends Serializable { } /** @noinspection UnusedDeclaration*/ interface Mover<T extends Serializable> { }