Рассмотрим этот код:
List<MyEdgeModified> modifiedList = new List<MyEdgeModified>();
// This is what you want to do, but which doesn't work
List<MyEdge> edgeList = modifiedList;
// Now this would have to be valid...
edgeList.add(new MyEdge());
// And this should be valid too...
MyEdgeModified modified = modifiedList.get(0);
... но вам удалось поместить ссылку на экземпляр MyEdge
в List<MyEdgeModified>
- так что вам удалось нарушить безопасность типов.
Вот какие правила существуют для предотвращения.
Теперь то, что вы можете сделать, это использовать подстановочные знаки:
List<MyEdgeModified> modifiedList = new List<MyEdgeModified>();
List<? extends MyEdge> edgeList = modifiedList;
В этот моментВы не сможете добавить к edgeList
, но вы можете взять у него предметы ... так что все в порядке.
Теперь создание List<List<? extends MyEdge>>
оказывается сложнееопять же ... я не могу вспомнить наизусть, разрешено ли это вообще ...
В общем, лучшее место, где можно найти подробности такого рода вещей, это FAQ Дженелики Лангер по Java Generics .