Это потому, что ArrayList<E>
не является ковариантным для типа E
. То есть вы не можете заменить экземпляр ArrayList<Derived>
на ArrayList<Base>
только потому, что Derived
наследуется от Base
.
Рассмотрим этот случай: String
наследуется от Object
; однако , если это означает, что вы можете использовать ArrayList<String>
в качестве ArrayList<Object>
, тогда будет возможен следующий код:
ArrayList<Object> list = new ArrayList<String>();
list.add(new Integer(5)); // Integer inherits from Object
Выше не может работать, потому что вы не можете добавить Integer
к ArrayList<String>
. Если бы вы могли, то это могло бы произойти:
ArrayList<String> stringList = (ArrayList<String>)list;
String string = stringList.get(0); // Not a string!
Как и Ziyao указал , правильный способ реализовать это - использовать синтаксис ? extends Edge
.