我想问一下与函数接口相关的以下代码。我感到困惑的是:
Rideable rider = Car :: new它是创建Rideable (接口)还是Car (类)实例?如果它正在创建一个Car对象,构造函数new Car() (即没有参数)应该不存在,那么为什么这是有效的呢?
我一直在读本教程,但还是搞不懂。
@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");
}
}发布于 2018-01-29 09:56:06
您正在使用Lambda语法来实现Rideable接口的getCar()方法,其中使用Lambda简洁的语法省略了以下匿名类程序:
Rideable rideable = new Rideable() {
@Override
public Car getCar(String name) {
return new Car(name);
}
};这是Java 7代码。您可以使用Lambda表达式实现相同的目标:
Rideable rider = name -> new Car(name);或者如您的示例所示,使用方法引用:
Rideable rider = Car::new;因此,可遍历对象的getCar(String)方法可以用作new Car(String)。
作为对您问题的回答,您正在创建一个Car类的实例,该实例实现了可遍历接口。这是另一种不用使用implement关键字就可以实现接口的方法。
如果你想:
Car auto = Car("MyCar")::new;或
Car auto = Car::new;
Car vehicle = auto::getCar("MyCar");或
Car vehicle = Rideable::new::getCar("MyCar");所有这些例子都是wrong方法。我给出了这个例子,因为这些是常见的错误,当我们谈到Lambda表达式或方法引用时,这些错误可能会发生。
发布于 2018-01-29 09:34:12
它是否创建了一个可乘(接口)或Car (类)实例?
它正在创建(实现类) Rideable接口的实例。
Rideable函数接口有一个方法-- getCar --它接受String参数并返回Car实例。
public Car (String name)构造函数接受一个String参数并生成一个Car实例。
因此,方法引用Car::new (在本例中不引用无参数构造函数)可以用作Rideable接口的实现。
如果这有助于澄清混淆,下面是一个与Car::new方法引用等价的lambda表达式:
Rideable rider = (String s) -> new Car(s);或
Rideable rider = s -> new Car(s);发布于 2018-01-29 11:24:59
您正在创建“汽车”的新对象,即“可乘坐”。所以是的,你正在创建新的“汽车”对象。
现在,Rideable被定义为“期待nameOfTheCar并通过getCar()方法为您提供Car实例”,这正是"Car::new"正在做的事情。
Car::new 在本例中,与(分配给可乘坐的)相同。
carName -> new Car(carName)现在,上面的行为是使用lambda包装的,它是Java7,如下所示:
Rideable rideable = new Rideable() {
@Override
public Car getCar(String carName ) {
return new Car(carName);
}
};现在假设您有了另一个接口
@FunctionalInterface
interface SelfRideable {
Car getSelfDriven();
}现在如果你做了
SelfRideable selfDriven = Car::new;然后它将不会编译,因为现在它没有任何参数,它的方法(getSelfDriven())。要使其工作,您需要有默认的构造函数。
https://stackoverflow.com/questions/48498069
复制相似问题