Java generized ссылка класса

Заканчивает блок итератора (например, говорит, что больше нет элементов в IEnumerable).

9
задан 5 August 2009 в 18:03
поделиться

4 ответа

Вам необходимо явно привести его к возвращаемому типу. Это работает:

return (Class<? extends List<String>>) List.class;

Да, это выглядит неправильно. Это лишь одна из многих причин беспорядка в системе универсальных шаблонов Java.

10
ответ дан 4 December 2019 в 12:20
поделиться

Из книги «Эффективная Java» (Второе издание, стр. 137): «Не используйте типы с подстановочными знаками в качестве возвращаемых типов. Вместо того, чтобы обеспечить дополнительную гибкость для ваших пользователей, это заставит их использовать подстановочные знаки в их клиентском коде ».

Тем не менее, для преобразования вы должны сначала создать временную переменную:

@SuppressWarnings("unchecked")
Class<? extends List<String>> result = ....;
return result;

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

5
ответ дан 4 December 2019 в 12:20
поделиться

Вы должны вернуть класс что-то, что расширяет List . ArrayList является одним из примеров. Вы можете попробовать:

ArrayList<String> myList = new ArrayList<String>();
...
return (Class<? extends List<String>>)myList.getClass();
2
ответ дан 4 December 2019 в 12:20
поделиться

List.class и List .class - во всех этих случаях вам потребуется приведение типов. На самом деле вам нужен тип, который имеет List во время выполнения, примерно так:

interface StringList extends List<String> {};

public Class<? extends List<String>> getObjectType() {
    return StringList.class;
}
0
ответ дан 4 December 2019 в 12:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: