【发布时间】:2017-08-17 09:40:12
【问题描述】:
当我看到 Iterable 接口源时,看起来foreach 方法和Spliterator 方法不是抽象的。接口如何具有非抽象方法?或者我有什么遗漏吗?见下方Iterbale接口源码。
package java.lang;
import java.util.Iterator;
import java.util.Objects;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.Consumer;
public abstract interface Iterable<T>
{
public abstract Iterator<T> iterator();
public void forEach(Consumer<? super T> paramConsumer)
{
Objects.requireNonNull(paramConsumer);
Iterator localIterator = iterator();
while (localIterator.hasNext())
{
Object localObject = localIterator.next();
paramConsumer.accept(localObject);
}
}
public Spliterator<T> spliterator()
{
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
/* Location: C:\Program Files\Java\jre1.8.0_121\lib\rt.jar
* Qualified Name: java.lang.Iterable
* Java Class Version: 8 (52.0)
* JD-Core Version: 0.7.1
*/
【问题讨论】:
-
是的,Java 8 接口可以有默认方法。阅读 Java 教程,或自 Java 8 出现之前编写的大量博客文章和文章。
-
这看起来不像实际的源代码。
forEach应声明为default。为什么它被声明为abstract interface?你在看什么版本? -
@Tom 它是 Java 类版本:8 (52.0)
-
不,不是。它看起来不像那样。除非您使用反编译器而不是查看实际源代码。
-
src.zip 中的类和反编译版本(使用 Fernflower 反编译器)都不是这样。
标签: java foreach interface abstract