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

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

JB *_*zet 6

您的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>.

  • 第一部分:是的.供应商<Shape>是一个不接受任何输入并生成Shape的函数.Square构造函数匹配:它不接受任何参数,并产生一个Square,它是一个Shape.*那么它是否意味着lambda可以分配给不相关的不同类型?*是的.重要的是签名和返回类型是兼容的.例如,方法`int foo(A a1,A a2)`可以用作比较器<A>,或者用作ToIntBiFunction <A,A>. (2认同)