Второй не скомпилируется.Представьте себе:
A implements MyInterface
B implements MyInterface
Тогда следующее выражение будет соответствовать вашему второму выражению, но не будет компилироваться:
// incorrect
List<A> mylist = new ArrayList<B>();
Исправление: тоже неверное :
List<? extends MyInterface> mylist = new ArrayList<MyInterface>();
Это верно в некотором смысле, что он компилируется, но вы не можете добавить к нему подклассы MyInterface.Смущает, но правильно - после прочтения объяснения.По той же причине: подстановочный знак можно рассматривать, например, как:
// I know this is not compileable; this is internal compiler "thinking".
// Read it as "somewhere someone may instantiate an ArrayList<A> and pass
// it down to us; but we cannot accept it as something that could be
// potentially used as List<B>"
List<A> mylist = new ArrayList<MyInterface>();
Так что это не сработает:
mylist.add(b);
и наоборот.Компилятор отказывается выполнять эти потенциально некорректные операции.
Опция, позволяющая вам добавить любой подкласс MyInterface в mylist:
List<MyInterface> mylist = new ArrayList<MyInterface>();