java - 自定义功能接口(interface)作为方法参数

标签 java functional-interface

我有下面的代码确实产生了预期的结果。有人可以解释幕后发生的事情吗?我不明白编译器/JVM 如何知道它需要在 Storer 对象上调用 store(String str) 或者它如何定义 doSomething (Storer s, String str) 实现。

Storer.java

public class Storer {
    private List<String> storer = new ArrayList<>();

    public void store(String str) {
        storer.add(str);
    }

    @Override
    public String toString() {
        return "Storer [storer=" + storer + "]";
    }

}

MyInterface.java

@FunctionalInterface
public interface MyInterface {
    public abstract void doSomething(Storer s, String str);
}

执行器.java

public class Executor {
    public void doStore(Storer storer, String s, MyInterface p) {
        p.doSomething(storer, s);
    }
}

TestFunctionalInterfaces.java

public class TestFunctionalInterfaces {
    public static void main(String[] args) {
        Storer storer = new Storer();

        Executor test = new Executor();
        test.doStore(storer, "I've got added", Storer::store);

        System.out.println(storer);
    }
}

输出是:

Storer [storer=[I've got added]]

提前致谢。

最佳答案

Storer::store 是一个方法引用,可以用来代替任何 @FunctionalInterface。你在这里得到的基本上是我的界面实现的简写。等价于:

public class MyInterfaceImpl implements MyInterface {
    public void doSomething(Storer storer, String str) {
       storer.store(str);
    } 
}

此实现(通过您的方法引用指定)是执行 storer.store() 的原因...因为您已指定并传递给执行器的 MyInterface 的实现。编译器足够聪明,可以将实现/方法引用与您提供的参数相匹配

关于java - 自定义功能接口(interface)作为方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55054611/

相关文章:

java - 使用 While 循环、使用扫描仪输入变量

java - 尝试使用 Intellij 连接到在线数据库

java-8 - 为什么@FunctionalInterface 不能应用于 SAM 抽象基类

java - 函数式接口(interface)中继承对象类方法有什么用,例如toString、equals

java - 如何将依赖项注入(inject)到需要前一个 Activity 参数的 Activity 中?

java - struts2 postgresql 找不到适合jdbc的驱动

java - 双击 JTree 节点并获取其名称

java - 是否可以声明 Supplier<T> 需要抛出异常?

java - 使用 Java8 将数组迭代转换为 lambda 函数

java - JUnit 断言抛出中的可执行文件会发生什么情况?