У меня есть загадка, которая заставила меня задуматься о том, существуют ли стандартные классы Java, которые реализуют Iterable<T>, не реализуя Collection<T>. Я реализую один интерфейс, который требует от меня определить метод, который принимает Iterable<T>, но для этого объекта, который я использую для поддержки этого метода, требуется Collection<T>.
У меня есть некоторый действительно kludgy код чувства, который дает некоторые непроверенные предупреждения при компиляции.
public ImmutableMap<Integer, Optional<Site>> loadAll(
        Iterable<? extends Integer> keys
) throws Exception {
    Collection<Integer> _keys;
    if (keys instanceof Collection) {
        _keys = (Collection<Integer>) keys;
    } else {
        _keys = Lists.newArrayList(keys);
    }
    final List<Site> sitesById = siteDBDao.getSitesById(_keys);
    // snip: convert the list to a map
Изменение моей итоговой коллекции для использования более генерируемого типа Collection<? extends Integer> не устраняет непроверенного предупреждения для этой строки. Кроме того, я не могу изменить подпись метода, чтобы принять Collection вместо Iterable, потому что тогда он больше не переопределяет супер-метод и не будет вызван при необходимости.
Там  не похоже на проблему с этой литой или копией: другие вопросы заданы здесь в другом месте и, похоже, глубоко внедрены в Java родовых и типов стирающих систем. Но я спрашиваю, есть ли когда-нибудь какие-либо классы, которые могут реализовать Iterable<T>, которые также не реализуют Collection<T>? Я просмотрел Iterable JavaDoc, и, конечно же, все, что я ожидаю, будет передано моему интерфейсу, будет фактически коллекцией. Я бы предпочел использовать ранее написанный класс in-the-wild, предварительно написанный, так как это гораздо вероятнее всего будет передаваться как параметр и сделает unit test намного более ценным.
Я уверен, что бит, созданный мной или копией, который я написал, работает с типами, которые я использую в моем проекте, из-за некоторых модульных тестов, которые я пишу. Но я бы хотел написать unit test для некоторого ввода, который является итерируемым, но не является коллекцией, и до сих пор все, что я смог придумать, сам реализует реализацию класса фиктивного теста.
Для любопытного метода, который я реализую, является Guava CacheLoader<K, V>.loadAll(Iterable<? extends K> keys), а метод backing - это объект, созданный с помощью JDBI-объекта, который требует, чтобы коллекция использовалась как тип параметра для @BindIn интерфейса. Я думаю, что я прав, думая, что это касается вопроса, но на всякий случай кто-то хочет попробовать боковое мышление по моей проблеме. Я знаю, что я мог просто разветкить проект JDBI и переписать аннотацию @BindIn, чтобы принять итеративный...
