因使用未绑定的方法引用而引发的:Non-static method cannot be referenced from a static context

本文主要是介绍因使用未绑定的方法引用而引发的:Non-static method cannot be referenced from a static context,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

未绑定的方法引用是指没有关联对象的普通(非静态)方法。这意味着想要使用它,必须先找个对象。


在学习stream时遇到个错误:Non-static method cannot be referenced from a static context。

实际上,最直接的报错原因并不是其语义所言的“被引用的方法是不是静态”的问题,而是“函数式接口的泛型没有匹配被引用方法的this类型”所致。详见代码注释。

import java.util.*;
import java.util.function.*;
import java.util.stream.*;class Pair {public final Integer i;public static int n = 0;Pair(Integer i) {this.i = i;}// 这个非静态方法表面上没有参数,但实际上在它的参数列表中,隐含了一个this,也就是指向对象的引用,其类型为Pair.// 所以这个方法的接收和返回类型分别是:Pair, Integer。public Integer getI() {  return i;}static public Pair getPair(){  // 这个方法将被Supplier引用,故必须是static,以避免参数列表中“this”的存在。return new Pair(n++);}
}public class UsePair {static Function<Pair,Integer> getIF(){  // 这里如果泛型的类型不匹配,就会报错。第一个类型是Pair,因为getI的参数"this"是Pair类型.return Pair::getI;}public static void main(String[] args) {// 不使用stream版本, 对应的函数式接口为Function。Pair[] pairs = new Pair[3];for (int i = 0; i < 3; i++) {pairs[i] = new Pair(i);}for (Pair pair : pairs) {System.out.println("" + getIF().apply(pair));}System.out.println();// 使用stream版,对应的函数式接口为Supplier和Function.Stream<Pair> sp = Stream.generate(Pair::getPair); // 流的创建方式之一,generate的参数接收Supplier类型。// 如果这里直接引用Pair::new,则报错,因为Pair的构造器有参,而Supplier的抽象方法无参。// 这里就是我一开始困惑的点(简化版),因为我忽略了this的存在。所以,此处对于“成员变量i”的获取方式,使我产生了疑惑。sp.limit(3).map(Pair::getI)  // map接收的是Function,此处为Function<Pair, Integer>,完美对应了getI。.forEach(System.out::println);     } 
}/* 测试运行结果:
0
1
20
1
2
*/

感谢阅读,请交流指正。

这篇关于因使用未绑定的方法引用而引发的:Non-static method cannot be referenced from a static context的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/736006

相关文章

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

Python如何使用seleniumwire接管Chrome查看控制台中参数

《Python如何使用seleniumwire接管Chrome查看控制台中参数》文章介绍了如何使用Python的seleniumwire库来接管Chrome浏览器,并通过控制台查看接口参数,本文给大家... 1、cmd打开控制台,启动谷歌并制定端口号,找不到文件的加环境变量chrome.exe --rem

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

redis-cli命令行工具的使用小结

《redis-cli命令行工具的使用小结》redis-cli是Redis的命令行客户端,支持多种参数用于连接、操作和管理Redis数据库,本文给大家介绍redis-cli命令行工具的使用小结,感兴趣的... 目录基本连接参数基本连接方式连接远程服务器带密码连接操作与格式参数-r参数重复执行命令-i参数指定命

PyTorch使用教程之Tensor包详解

《PyTorch使用教程之Tensor包详解》这篇文章介绍了PyTorch中的张量(Tensor)数据结构,包括张量的数据类型、初始化、常用操作、属性等,张量是PyTorch框架中的核心数据结构,支持... 目录1、张量Tensor2、数据类型3、初始化(构造张量)4、常用操作5、常用属性5.1 存储(st

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取