使用以下模型:
package supplier;
public interface Shape {
void draw();
public static class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
public static class Circle implements Shape {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
public static class Square implements Shape {
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
}
我试图了解Java如何确定构造函数引用返回的lambda表达式的类型:
Shape square = Square::new;
System.out.println("square: "+square);
Supplier<Shape> suppSquare = Square::new;
System.out.println("suppSquare: "+suppSquare);
square: supplier.ShapeFactoryTest$$Lambda$11/183264084@1c655221
suppSquare: supplier.ShapeFactoryTest$$Lambda$12/1490180672@1b701da1
这两种情况似乎都在返回lambda,但以下内容无法编译:
square = suppSquare;
如何在第一种情况下将lambda解析为基础类型?
答案 0 :(得分:5)
您的Shape接口是一个功能接口,因为它有一个抽象方法draw()
。这种方法不会引用任何参数,也不会返回任何参数。因此它类似于Runnable。
Square的构造函数不接受任何论证,以及它返回的内容&#34; (或者更确切地说,创造)可以被忽略。因此,它可用作Shape
功能接口的实现:其签名是兼容的。这就是你被允许使用
Shape square = Square::new;
定义了square
类型的变量Shape
。
但这并没有多大意义,因为在变量square
上调用draw()时,您可能希望有一些绘图发生。但那不会发生。 Square
的构造函数将被调用,这就是全部。
正在做
square = suppSquare;
可能无法正常工作,因为square是Shape类型的变量,而Shape不是Supplier<Shape>
的超类型。