@FunctionalInterface
public interface Streamable<T> extends Iterable<T>, Supplier<Stream<T>>
我正在探索Streamable接口(interface),遇到的第一个方法是
empty()
方法,该方法具有以下定义。static <T> Streamable<T> empty() {
return Collections::emptyIterator;
}
Collections::emptyIterator
返回Iterator<T>
,但是此方法的返回类型为Streamable<T>
。 Streamble扩展了Iterable和Supplier而不是Iterator接口(interface)。我不知道那怎么运作良好。
有人可以帮我理解这一点吗?
我只是在这里没有理解这个概念。我想知道继承是如何工作的,所以我想知道它是如何工作的,但是我无法弄清楚。我想我在这里错过了一些东西。
最佳答案
empty()
返回方法引用Collections::emptyIterator
。
为了使该代码能够通过编译,该方法引用必须与Streamable<>
接口(interface)的单个抽象方法一致。Collections
的emptyIterator()
不带参数,并返回Iterator<T>
。Streamable<>
扩展了Iterable<T>
和Supplier<Stream<T>>
,这意味着它必须实现两种方法(iterator()
和get()
),但是其中一种方法不能抽象(否则将不是功能接口(interface))。Collections
的emptyIterator()
可以符合Iterable<T>
的Iterator<T> iterator()
签名。
因此,如果Streamable<T>
具有Supplier<Stream<T>>
的get()
方法的默认实现(如果没有,则Streamable<T>
不能作为功能接口(interface)),因此Collections::emptyIterator
可以实现Streamable<T>
接口(interface)。
编辑:如果您指的是org.springframework.data.util.Streamable,您可以看到它确实具有get()
的默认实现:
/*
* (non-Javadoc)
* @see java.util.function.Supplier#get()
*/
default Stream<T> get() {
return stream();
}
因此,任何符合单个抽象方法
Iterator<T> iterator()
的方法引用都可以实现该接口(interface)。因此Collections::emptyIterator
可以实现Streamable<T>
。关于java - 流式接口(interface): How empty() method returns Iterable?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57285737/