Sim*_*zon 4 lambda types java-8
使用以下型号:
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.");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我试图了解Java如何确定构造函数引用返回的lambda表达式的类型:
Shape square = Square::new;
System.out.println("square: "+square);
Supplier<Shape> suppSquare = Square::new;
System.out.println("suppSquare: "+suppSquare);
Run Code Online (Sandbox Code Playgroud)
square: supplier.ShapeFactoryTest$$Lambda$11/183264084@1c655221
suppSquare: supplier.ShapeFactoryTest$$Lambda$12/1490180672@1b701da1
Run Code Online (Sandbox Code Playgroud)
这两种情况似乎都返回lambdas但是以下不能编译:
square = suppSquare;
Run Code Online (Sandbox Code Playgroud)
那么在第一种情况下如何将lambda解析为基础类型?
您的Shape接口是一个功能接口,因为它有一个抽象方法draw().此方法不接受任何参数,并且不返回任何内容.因此它类似于Runnable.
Square的构造函数不接受任何参数,可以忽略它"返回"(或者更确切地说,创建)的内容.因此它可用作Shape功能接口的实现:它的签名是兼容的.这就是你被允许使用的原因
Shape square = Square::new;
Run Code Online (Sandbox Code Playgroud)
它定义了一个square类型的变量Shape.
这虽然没有多大意义,因为在变量上调用draw()时square,你可能会发生一些绘图.但那不会发生.Square将只调用will 的构造函数,就是这样.
并做
square = suppSquare;
Run Code Online (Sandbox Code Playgroud)
不可能工作,因为square是Shape类型的变量,而Shape不是超类型Supplier<Shape>.
| 归档时间: |
|
| 查看次数: |
128 次 |
| 最近记录: |