Ссылка на Java с общими списками - PullRequest
3 голосов
/ 15 октября 2010

Я чувствую себя глупо, спрашивая об этом, но я.

Строка List<HasId> ids = list выдает ошибку компиляции в следующем коде:

public class MyGarbageClass {

    public void myMethod(List<MyCompany> list){
        List<HasId> ids = list;
    }

    interface HasId {
        int getId();
    }
    class MyCompany implements HasId{
        private int id = 5;
        @Override
        public int getId() {
            return id;
        }
    }
}

MyCompany реализует HasId, поэтому я подумал, что долженбыть в состоянии назначить это.Почему я не могу?И что более важно , что является простым способом присвоить это списку объектов HasId.

update : список идентификаторов = (List<HasId>)list; также разбивается на необратимые типы

Ответы [ 3 ]

9 голосов
/ 15 октября 2010

Причина, по которой такое общее назначение запрещено, заключается в том, что можно выполнить приведение и затем добавить что-то в 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 () не будут разрешены, но вы можете повторить его, чтобы получить идентификатор, если хотите.

3 голосов
/ 15 октября 2010

Это Тип безопасности .

List<HasId> ids ;  

Объявлен прием только списка HasId.

3 голосов
/ 15 октября 2010

Это не разрешено, потому что это может позволить вам сделать это:

List<MyCompany> companies = ...;
List<HasId> ids = companies;
ids.add(new HasId() {});
MyCompany c = companies.pop(); // <---- Not a MyCompany!!!!

Возможно, вам будет лучше использовать List<? extends HasId>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...