Spec-Zone .ru
спецификации, руководства, описания, API
|
Один из более запутывающих аспектов, учась программировать с обобщениями определяет, когда использовать верхний ограниченный подстановочный знак и когда использовать более низкий ограниченный подстановочный знак. Эта страница обеспечивает некоторые направляющие линии, чтобы следовать, разрабатывая Ваш код.
В целях этого обсуждения полезно думать о переменных как об обеспечении одной из двух функций:
Конечно, некоторые переменные используются и для "в" и цели — этот сценарий также адресуется в направляющих линиях.
Можно использовать "в" и принцип, решая, использовать ли подстановочный знак и какой подстановочный знак является соответствующим. Следующий список обеспечивает направляющие линии, чтобы следовать:
Эти направляющие линии не применяются к типу возврата метода. Используя подстановочный знак, поскольку нужно избежать типа возврата, потому что он вынуждает программистов, использующих код иметь дело с подстановочными знаками.
Список, определенный List<? extends ...>, может неофициально считаться только для чтения, но это не строгая гарантия. Предположите, что у Вас есть следующие два класса:
class NaturalNumber { private int i; public NaturalNumber(int i) { this.i = i; } // ... } class EvenNumber extends NaturalNumber { public EvenNumber(int i) { super(i); } // ... }
Рассмотрите следующий код:
List<EvenNumber> le = new ArrayList<>(); List<? extends NaturalNumber> ln = le; ln.add(new NaturalNumber(35)); // compile-time error
Поскольку List<EvenNumber> является подтипом List<? extends NaturalNumber>, можно присвоить le ln. Но невозможно использовать ln, чтобы добавить натуральное число к списку четных чисел. Следующие операции в списке возможны:
Можно видеть, что список, определенный List<? extends NaturalNumber>, не только для чтения в самом строгом значении слова, но Вы могли бы думать об этом тот путь, потому что невозможно сохранить новый элемент или изменить существующий элемент в списке.