首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java8:关于功能接口

Java8:关于功能接口
EN

Stack Overflow用户
提问于 2018-01-29 09:31:01
回答 3查看 1.1K关注 0票数 6

我想问一下与函数接口相关的以下代码。我感到困惑的是:

代码语言:javascript
复制
Rideable rider = Car :: new

它是创建Rideable (接口)还是Car (类)实例?如果它正在创建一个Car对象,构造函数new Car() (即没有参数)应该不存在,那么为什么这是有效的呢?

我一直在读本教程,但还是搞不懂。

代码语言:javascript
复制
@FunctionalInterface 
interface Rideable {
  Car getCar (String name);
}

class Car {
  private String name;

  public Car (String name) {
    this.name = name;
  }
}

public class Test {
  public static void main(String[] args) {
    Rideable rider = Car :: new; 
    Car vehicle = rider.getCar("MyCar");
  }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-29 09:56:06

您正在使用Lambda语法来实现Rideable接口的getCar()方法,其中使用Lambda简洁的语法省略了以下匿名类程序:

代码语言:javascript
复制
Rideable rideable = new Rideable() {
    @Override
    public Car getCar(String name) {
        return new Car(name);
    }
};

这是Java 7代码。您可以使用Lambda表达式实现相同的目标:

代码语言:javascript
复制
Rideable rider = name -> new Car(name);

或者如您的示例所示,使用方法引用:

代码语言:javascript
复制
Rideable rider = Car::new;

因此,可遍历对象的getCar(String)方法可以用作new Car(String)

作为对您问题的回答,您正在创建一个Car类的实例,该实例实现了可遍历接口。这是另一种不用使用implement关键字就可以实现接口的方法。

如果你想:

代码语言:javascript
复制
Car auto = Car("MyCar")::new;

代码语言:javascript
复制
Car auto = Car::new;
Car vehicle = auto::getCar("MyCar");

代码语言:javascript
复制
Car vehicle = Rideable::new::getCar("MyCar");

所有这些例子都是wrong方法。我给出了这个例子,因为这些是常见的错误,当我们谈到Lambda表达式或方法引用时,这些错误可能会发生。

票数 1
EN

Stack Overflow用户

发布于 2018-01-29 09:34:12

它是否创建了一个可乘(接口)或Car (类)实例?

它正在创建(实现类) Rideable接口的实例。

Rideable函数接口有一个方法-- getCar --它接受String参数并返回Car实例。

public Car (String name)构造函数接受一个String参数并生成一个Car实例。

因此,方法引用Car::new (在本例中不引用无参数构造函数)可以用作Rideable接口的实现。

如果这有助于澄清混淆,下面是一个与Car::new方法引用等价的lambda表达式:

代码语言:javascript
复制
Rideable rider = (String s) -> new Car(s);

代码语言:javascript
复制
Rideable rider = s -> new Car(s);
票数 5
EN

Stack Overflow用户

发布于 2018-01-29 11:24:59

您正在创建“汽车”的新对象,即“可乘坐”。所以是的,你正在创建新的“汽车”对象。

现在,Rideable被定义为“期待nameOfTheCar并通过getCar()方法为您提供Car实例”,这正是"Car::new"正在做的事情。

代码语言:javascript
复制
Car::new 

在本例中,与(分配给可乘坐的)相同。

代码语言:javascript
复制
carName -> new Car(carName)

现在,上面的行为是使用lambda包装的,它是Java7,如下所示:

代码语言:javascript
复制
Rideable rideable = new Rideable() {
    @Override
    public Car getCar(String carName ) {
        return new Car(carName);
    }
};

现在假设您有了另一个接口

代码语言:javascript
复制
@FunctionalInterface
interface SelfRideable {
    Car getSelfDriven();
}

现在如果你做了

代码语言:javascript
复制
SelfRideable selfDriven = Car::new;

然后它将不会编译,因为现在它没有任何参数,它的方法(getSelfDriven())。要使其工作,您需要有默认的构造函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48498069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档