Spec-Zone .ru
спецификации, руководства, описания, API
След: Изучение Языка Java
Урок: (Обновленные) Обобщения
Раздел: Подстановочные знаки
Направляющие линии для Подстановочного Использования
Домашняя страница > Изучение Языка Java > (Обновленные) обобщения

Направляющие линии для Подстановочного Использования

Один из более запутывающих аспектов, учась программировать с обобщениями определяет, когда использовать верхний ограниченный подстановочный знак и когда использовать более низкий ограниченный подстановочный знак. Эта страница обеспечивает некоторые направляющие линии, чтобы следовать, разрабатывая Ваш код.

В целях этого обсуждения полезно думать о переменных как об обеспечении одной из двух функций:

"В" Переменной
"В" переменной подает данные к коду. Вообразите метод копии с двумя параметрами: copy(src, dest). Параметр src обеспечивает данные, которые будут скопированы, таким образом, это "в" параметре.
Переменная
Переменная содержит данные для использования в другом месте. В примере копии, copy(src, dest), параметр dest принимает данные, таким образом, это параметр.

Конечно, некоторые переменные используются и для "в" и цели — этот сценарий также адресуется в направляющих линиях.

Можно использовать "в" и принцип, решая, использовать ли подстановочный знак и какой подстановочный знак является соответствующим. Следующий список обеспечивает направляющие линии, чтобы следовать:


Подстановочные Направляющие линии: 
  • "В" переменной определяется с помощью верхнего ограниченного подстановочного знака, используя ключевое слово extends.
  • Переменная определяется с помощью более низкого ограниченного подстановочного знака, используя ключевое слово super.
  • В случае, где "в" переменной может быть получен доступ, используя методы, определенные в Object class, используйте неограниченный подстановочный знак.
  • В случае, где код должен получить доступ к переменной и как "в" и как переменная, не используйте подстановочный знак.

Эти направляющие линии не применяются к типу возврата метода. Используя подстановочный знак, поскольку нужно избежать типа возврата, потому что он вынуждает программистов, использующих код иметь дело с подстановочными знаками.

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


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Подстановочное Получение и Методы Помощника
Следующая страница: Введите Стирание