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