Заканчивает блок итератора (например, говорит, что больше нет элементов в IEnumerable).
Вам необходимо явно привести его к возвращаемому типу. Это работает:
return (Class<? extends List<String>>) List.class;
Да, это выглядит неправильно. Это лишь одна из многих причин беспорядка в системе универсальных шаблонов Java.
Из книги «Эффективная Java» (Второе издание, стр. 137): «Не используйте типы с подстановочными знаками в качестве возвращаемых типов. Вместо того, чтобы обеспечить дополнительную гибкость для ваших пользователей, это заставит их использовать подстановочные знаки в их клиентском коде ».
Тем не менее, для преобразования вы должны сначала создать временную переменную:
@SuppressWarnings("unchecked")
Class<? extends List<String>> result = ....;
return result;
Это работает, потому что у вас могут быть аннотации к присвоениям. Он не работает с , возвращает
сам. Вы также можете добавить это к методу, но это также скроет другие проблемы.
Вы должны вернуть класс что-то, что расширяет List
. ArrayList
является одним из примеров. Вы можете попробовать:
ArrayList<String> myList = new ArrayList<String>();
...
return (Class<? extends List<String>>)myList.getClass();
List.class и List
interface StringList extends List<String> {};
public Class<? extends List<String>> getObjectType() {
return StringList.class;
}