因使用未绑定的方法引用而引发的: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自建轻量级的HTTP调试工具

《使用Python自建轻量级的HTTP调试工具》这篇文章主要为大家详细介绍了如何使用Python自建一个轻量级的HTTP调试工具,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录一、为什么需要自建工具二、核心功能设计三、技术选型四、分步实现五、进阶优化技巧六、使用示例七、性能对比八、扩展方向建

Spring Security方法级安全控制@PreAuthorize注解的灵活运用小结

《SpringSecurity方法级安全控制@PreAuthorize注解的灵活运用小结》本文将带着大家讲解@PreAuthorize注解的核心原理、SpEL表达式机制,并通过的示例代码演示如... 目录1. 前言2. @PreAuthorize 注解简介3. @PreAuthorize 核心原理解析拦截与

一文详解JavaScript中的fetch方法

《一文详解JavaScript中的fetch方法》fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,:本文主要介绍Jav... 目录前言什么是 fetch 方法基本语法简单的 GET 请求示例代码解释发送 POST 请求示例代码解释

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

CSS去除a标签的下划线的几种方法

《CSS去除a标签的下划线的几种方法》本文给大家分享在CSS中,去除a标签(超链接)的下划线的几种方法,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧... 在 css 中,去除a标签(超链接)的下划线主要有以下几种方法:使用text-decoration属性通用选择器设置:使用a标签选择器,将tex