这是一个已知的问题?我找不到任何搜索结果.
在迭代已经进行时迭代ServiceLoader时,第一次迭代将被中止.例如,假设至少有两个Foo实现,以下代码将失败并出现AssertionError:
ServiceLoader<Foo> loader = ServiceLoader.load(Foo.class);
Iterator<Foo> iter1 = loader.iterator();
iter1.next();
Iterator<Foo> iter2 = loader.iterator();
while (iter2.hasNext()) {
iter2.next();
}
assert iter1.hasNext();
如果第二个迭代器真正终止,这似乎只会发生.代码将在此变体中成功,例如:
ServiceLoader<Foo> loader = ServiceLoader.load(Foo.class);
Iterator<Foo> iter1 = loader.iterator();
iter1.next();
Iterator<Foo> iter2 = loader.iterator();
iter2.next();
assert iter1.hasNext();
这是一个错误还是一个功能? :p
在任何地方都有票吗?
最佳答案 这可能是一个错误.我认为是因为iterator.next()在内部的惰性迭代器的相同引用上调用next().
这种行为违反了“最不惊讶的原则”