【问题标题】:Can you instantiate an interface when passing an interface in Java? [duplicate]在Java中传递接口时可以实例化接口吗? [复制]
【发布时间】:2019-01-03 19:00:21
【问题描述】:

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

interface Executable {
    void execute();
}

您将无法显式实例化它。如果您尝试创建接口 Executable 的新实例,则会收到编译错误,提示“无法实例化 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 的新实例吗?有什么我不明白的吗?非常感谢一个简短的解释和一些例子!

【问题讨论】:

  • 称为匿名类
  • 这叫做匿名类声明,不是实例化

标签: java interface instantiation


【解决方案1】:

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

一个例子是如何在java中创建一个线程

Thread t= new Thread(new Runnable() {

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

            }
        });

在 Thread 构造函数中,我们传递了一个匿名内部类,它实现了接口Runnable

【讨论】:

    【解决方案2】:

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

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

    interface Executable {
        void execute();
    }
    

    实例化是:

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

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

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

    【讨论】:

    • 这正是我所需要的!我现在要研究 lambda 表达式。
    • 我个人喜欢 lambda 表达式。 r.run(() -> System.out.println("Executed!")); 看起来更好,对吧? :) 您甚至可以将所有 main 方法缩短为:new Runner().run(() -> System.out.println("Executed!"));
    猜你喜欢
    • 1970-01-01
    • 2011-06-03
    • 2022-01-06
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多