0

0

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

P粉602998670

P粉602998670

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

|

753人浏览过

|

来源于php中文网

原创

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

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

方法引用到底在引用什么

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

必须满足:被引用方法的签名(参数类型、返回值)与函数式接口抽象方法的签名兼容。例如 Consumeraccept(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免费学习笔记(深入)”;

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

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

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

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

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

请注意以下说明: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 表达式中写明泛型构造。

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

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

831

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

737

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

733

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16925

2023.08.03

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

10

2026.01.12

热门下载

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

精品课程

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

共23课时 | 2.4万人学习

C# 教程
C# 教程

共94课时 | 6.5万人学习

Java 教程
Java 教程

共578课时 | 45.1万人学习

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

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