在Java中传递一个接口能不能实例化一个接口?

Can you instantiate an interface when passing an interface in Java?

例如,如果我有一个接口:

interface Executable {
    void execute();
}

您将无法显式实例化它。如果您尝试创建接口可执行文件的新实例,则会出现编译错误,显示 'cannot instantiate the type Executable'.

但是,当尝试将接口传递给方法时,我意识到您可以这样做:

class Runner {
    public void run(Executable e) {
        System.out.println("Executing block of code...");
        e.execute();
    }
}

public class App {
    public static void main(String[] args) {
        Runner r = new Runner();

        // When passing the Executable type, am I instantiating it?
        r.run(new Executable() {
            public void execute() {
                System.out.println("Executed!");
            }
        });

    }
}

这怎么可能?您不是因为 new 关键字而创建接口 Executable 的新实例吗?有什么我不明白的吗?非常感谢简要说明和一些示例!

接口是 class 提供需要实现的方法模板。您不能按原样实例化接口,因为如果没有其方法实现,它什么也做不了。

如果您实例化一个实现接口的对象,则会提供方法的实现,并且其工作原理与使用相同方法的实现实例化接口几乎相同。在您的情况下,它称为 Anonymous Class ,它仅提供要使用的方法的必要实现。有接口:

interface Executable {
    void execute();
}

实例化为:

Executable executable = new Executable() {
    @Override
    public void execute() {
        System.out.println("Executed!");
    }
}

这里您提供方法 execute() 一个实现。由于该接口只有一个方法并且充当功能接口,因此您可以使用 lambda 表达式对其进行简化,因为 Java 8:

Executable executable = () ->  System.out.println("Executed!");

你不是因为 new 关键字而创建了一个新的 interface Executable 实例吗? 答案:您不是在实例化接口。实际上,您是在实例化一个实现了 Exceutable 的匿名内部 class .

示例是如何在 java

中创建线程
Thread t= new Thread(new Runnable() {

            @Override
            public void run() {
                System.out.println("Hello World!");

            }
        });

在 Thread 构造函数中,我们传递了一个实现接口 Runnable

的匿名内部 class