Java 8构造函数引用的类型是什么?

时间:2018-01-27 18:41:58

标签: 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.");
        }
    }
}

我试图了解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解析为基础类型?

1 个答案:

答案 0 :(得分:5)

您的Shape接口是一个功能接口,因为它有一个抽象方法draw()。这种方法不会引用任何参数,也不会返回任何参数。因此它类似于Runnable。

Square的构造函数不接受任何论证,以及它返回的内容&#34; (或者更确切地说,创造)可以被忽略。因此,它可用作Shape功能接口的实现:其签名是兼容的。这就是你被允许使用

的原因
Shape square = Square::new;

定义了square类型的变量Shape

但这并没有多大意义,因为在变量square上调用draw()时,您可能希望有一些绘图发生。但那不会发生。 Square的构造函数将被调用,这就是全部。

正在做

square = suppSquare;

可能无法正常工作,因为square是Shape类型的变量,而Shape不是Supplier<Shape>的超类型。