Почему for (T t: ClassName) работает и что это значит? - Джава - PullRequest
3 голосов
/ 22 декабря 2019
public abstract class MyAbstractSet<T> implements Iterable<T> { 
    ...
    // some code
    ...
    method addElement(T t){
        for (T t : this) {
           //why does this work????
        }
    }
}

Я только что закончил домашнюю работу о наборах и реализации классов Iterable и Iterator в Java. Главная цель домашней работы - понять дженерики и коллекции, которые я сейчас понимаю.

Однако, реализуя этот класс выше MyAbstractSet<T>, я набрал for(T t: this) по ошибке, что меня как-то смутило, поскольку у компилятора не было проблем при его компиляции. Я пытался понять, что это значит, но пока ничего не ясно. Например, добавление общего типа <T> делает класс своего рода списком, который повторяет цикл for-each?

Может кто-нибудь объяснить мне, почему это работает и что это делает, может быть, также опубликовать ссылку, где это объясняется в документации по Java? Ваша помощь очень ценится. : D

Ответы [ 2 ]

7 голосов
/ 22 декабря 2019

Проще говоря, это комбинация из них:

  • Усовершенствованный цикл for, держу пари, вы знаете это:

    List<String> listOfStrings = ...
    for (String string: listOfStrings)
    
  • T обозначает универсальный тип. List<T> является хорошим примером.

  • this относится к экземпляру класса, где вызывается метод. Поскольку this реализует Iterable<T>, его можно использовать в расширенном цикле.

Следовательно, for (T t : this) является расширенным циклом того же самого экземпляра класса всех элементов, к которым осуществляется доступ черезforEach(Consumer<? super T> action).

3 голосов
/ 22 декабря 2019

Спецификация языка Java, раздел 14.14.2. Расширенный оператор for говорит:

Тип Выражения должен быть подтипом необработанного типа Iterable или типа массива ( §10.1), или возникает ошибка времени компиляции.

Поскольку ваш объект this реализует Iterable, цикл действителен и будет выполнять итерацию элементов вашего набора, вызываяiterator() метод.

Ваш цикл скомпилирован в следующее, за исключением того, что iter является скрытой переменной:

for (Iterator<T> iter = this.iterator(); iter.hasNext(); ) {
    T t = iter.next();
    ...
}

См. ссылку JLS выше для полного описания того, как онкомпилируется.

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