@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)的单个​​抽象方法一致。
CollectionsemptyIterator()不带参数,并返回Iterator<T>
Streamable<>扩展了Iterable<T>Supplier<Stream<T>>,这意味着它必须实现两种方法(iterator()get()),但是其中一种方法不能抽象(否则将不是功能接口(interface))。
CollectionsemptyIterator()可以符合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/

10-10 09:03