0

0

Java方法引用与构造方法引用的核心概念

P粉602998670

P粉602998670

发布时间:2026-01-12 17:27:10

|

753人浏览过

|

来源于php中文网

原创

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

java方法引用与构造方法引用的核心概念

方法引用到底在引用什么

方法引用不是复制方法逻辑,而是创建一个函数式接口的实例,其行为等同于调用目标方法。它本质是语法糖,背后仍由编译器生成实现了对应接口的类(通常是 LambdaMetafactory 生成的匿名类或直接使用 invokedynamic)。

必须满足:被引用方法的签名(参数类型、返回值)与函数式接口抽象方法的签名兼容。例如 Consumer<string></string>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<t></t>(无参构造)、Function<t r></t>(单参构造)、BiFunction<a b r></a>(双参构造)等。比如:

立即学习Java免费学习笔记(深入)”;

Supplier<ArrayList> sup = ArrayList::new; // 调用无参构造
Function<Integer, ArrayList> fun = ArrayList::new; // 调用 ArrayList(int) 构造器
BiFunction<String, String, Person> bi = Person::new; // 调用 Person(String, String)

注意:Person::new 并不指定具体哪个重载构造器,编译器根据上下文函数式接口类型推断。如果存在多个匹配构造器(如 Person(String)Person(int)),而接口是 Function<object person></object>,就会编译失败 —— 类型擦除导致无法区分 ObjectString 还是 int 的转换。

白月生产企业订单管理系统GBK2.0  Build 080807
白月生产企业订单管理系统GBK2.0 Build 080807

请注意以下说明:1、本程序允许任何人免费使用。2、本程序采用PHP+MYSQL架构编写。并且经过ZEND加密,所以运行环境需要有ZEND引擎支持。3、需要售后服务的,请与本作者联系,联系方式见下方。4、本程序还可以与您的网站想整合,可以实现用户在线服务功能,可以让客户管理自己的信息,可以查询自己的订单状况。以及返点信息等相关客户利益的信息。这个功能可提高客户的向心度。安装方法:1、解压本系统,放在

下载

为什么 Arrays::stream 不是构造方法引用

Arrays::stream 是静态方法引用,不是构造引用。容易混淆是因为它返回流,看起来像“创建”了新对象,但它调用的是 Arrays.stream(T[]) 这个静态方法,而非任何类的构造器。

真正易错的是误写成 Stream::new。这行不通,因为 Stream 是接口,没有可访问的 public 构造器;即使有,Stream::new 也无法满足大多数函数式接口(如 Supplier<stream></stream>)的语义 —— Stream 必须由数据源(数组、集合、生成器)构建,不能凭空 new。

  • ✅ 正确:Arrays::stream(静态方法引用)
  • ❌ 错误:Stream::new(编译失败:接口不可实例化 + 无可见构造器)
  • ⚠️ 危险:new ArrayList()::stream —— 这是实例方法引用,但每次执行都新建空列表再调 stream(),语义异常且低效

泛型类的构造方法引用要小心类型擦除

泛型信息在运行时不存在,所以构造方法引用对泛型参数的约束仅存在于编译期。例如:

Function<String, List<String>> f1 = ArrayList::new; // 编译通过,但实际创建的是 raw ArrayList
Supplier<List<String>> s1 = () -> new ArrayList<String>(); // 显式泛型,更清晰

上面 f1.apply("hello") 返回的是 ArrayList(非 ArrayList<string></string>),虽然变量声明为 List<string></string>,但构造器本身不接收泛型参数。JVM 看到的只是 new ArrayList()

这意味着:如果你依赖构造器引用完成泛型初始化(比如想让返回的集合自带类型约束),它做不到。必须配合显式类型声明或后续强转(不推荐)——真正安全的方式仍是 lambda 表达式中写明泛型构造。

构造方法引用简洁,但它的类型推断能力有限,尤其在嵌套泛型或重载多的情况下,编译器容易报错或选错构造器。遇到问题,第一反应不是改写法,而是检查函数式接口类型是否足够精确、构造器是否唯一可匹配。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

611

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

334

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

235

2025.08.29

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

215

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

192

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

61

2026.01.05

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.1万人学习

Java 教程
Java 教程

共578课时 | 80.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号