方法引用引用的是与函数式接口抽象方法签名兼容的目标方法或构造器,本质是编译器生成的语法糖,包括静态、实例、数组构造及构造方法引用四种形式。

方法引用到底在引用什么
方法引用不是复制方法逻辑,而是创建一个函数式接口的实例,其行为等同于调用目标方法。它本质是语法糖,背后仍由编译器生成实现了对应接口的类(通常是 LambdaMetafactory 生成的匿名类或直接使用 invokedynamic)。
必须满足:被引用方法的签名(参数类型、返回值)与函数式接口抽象方法的签名兼容。例如 Consumer 的 accept(String) 可以用 System.out::println,因为 println(String) 参数和返回值匹配;但不能用 System.out::read(参数不匹配,且返回 int)。
- 静态方法引用:
ClassName::staticMethod,如String::valueOf - 实例方法引用(已有对象):
object::instanceMethod,如list::add - 实例方法引用(未绑定对象,靠参数传入):
ClassName::instanceMethod,如String::toLowerCase—— 第一个参数自动作为调用对象 - 数组构造引用:
TypeName[]::new,如String[]::new
构造方法引用的特殊性
构造方法引用是方法引用的一种,但目标不是普通方法,而是类的构造器。它要求构造器签名必须与函数式接口抽象方法的签名一致——即接口方法的参数,会原样传递给构造器。
常见适配接口是 Supplier(无参构造)、Function(单参构造)、BiFunction(双参构造)等。比如:
立即学习“Java免费学习笔记(深入)”;
Suppliersup = ArrayList::new; // 调用无参构造 Function fun = ArrayList::new; // 调用 ArrayList(int) 构造器 BiFunction bi = Person::new; // 调用 Person(String, String)
注意:Person::new 并不指定具体哪个重载构造器,编译器根据上下文函数式接口类型推断。如果存在多个匹配构造器(如 Person(String) 和 Person(int)),而接口是 Function,就会编译失败 —— 类型擦除导致无法区分 Object 到 String 还是 int 的转换。
为什么 Arrays::stream 不是构造方法引用
Arrays::stream 是静态方法引用,不是构造引用。容易混淆是因为它返回流,看起来像“创建”了新对象,但它调用的是 Arrays.stream(T[]) 这个静态方法,而非任何类的构造器。
请注意以下说明:1、本程序允许任何人免费使用。2、本程序采用PHP+MYSQL架构编写。并且经过ZEND加密,所以运行环境需要有ZEND引擎支持。3、需要售后服务的,请与本作者联系,联系方式见下方。4、本程序还可以与您的网站想整合,可以实现用户在线服务功能,可以让客户管理自己的信息,可以查询自己的订单状况。以及返点信息等相关客户利益的信息。这个功能可提高客户的向心度。安装方法:1、解压本系统,放在
真正易错的是误写成 Stream::new。这行不通,因为 Stream 是接口,没有可访问的 public 构造器;即使有,Stream::new 也无法满足大多数函数式接口(如 Supplier)的语义 —— Stream 必须由数据源(数组、集合、生成器)构建,不能凭空 new。
- ✅ 正确:
Arrays::stream(静态方法引用) - ❌ 错误:
Stream::new(编译失败:接口不可实例化 + 无可见构造器) - ⚠️ 危险:
new ArrayList()::stream—— 这是实例方法引用,但每次执行都新建空列表再调 stream(),语义异常且低效
泛型类的构造方法引用要小心类型擦除
泛型信息在运行时不存在,所以构造方法引用对泛型参数的约束仅存在于编译期。例如:
Function> f1 = ArrayList::new; // 编译通过,但实际创建的是 raw ArrayList Supplier > s1 = () -> new ArrayList
(); // 显式泛型,更清晰
上面 f1.apply("hello") 返回的是 ArrayList(非 ArrayList),虽然变量声明为 List,但构造器本身不接收泛型参数。JVM 看到的只是 new ArrayList()。
这意味着:如果你依赖构造器引用完成泛型初始化(比如想让返回的集合自带类型约束),它做不到。必须配合显式类型声明或后续强转(不推荐)——真正安全的方式仍是 lambda 表达式中写明泛型构造。
构造方法引用简洁,但它的类型推断能力有限,尤其在嵌套泛型或重载多的情况下,编译器容易报错或选错构造器。遇到问题,第一反应不是改写法,而是检查函数式接口类型是否足够精确、构造器是否唯一可匹配。









