Причина, по которой такое общее назначение запрещено, заключается в том, что можно выполнить приведение и затем добавить что-то в ids
, который не является MyCompany (возможно, MyPerson, который также реализует HasId).Поэтому, если приведение было разрешено, вы могли бы сделать это.
public void myMethod(List<MyCompany> list){
List<HasId> ids = list;
ids.add(new MyPerson());
}
Теперь список нарушил универсальную гарантию, потому что у вас есть список, который был объявлен как <MyCompany>
с MyPerson в нем.
Вы можете разыграть его следующим образом.
public void myMethod(List<MyCompany> list){
List<? extends HasId> ids = list;
}
Но операции add () не будут разрешены, но вы можете повторить его, чтобы получить идентификатор, если хотите.