Java8 Stream()引发的“non-static method cannot be referenced from a static context”
问题描述: 使用Java8 Stream对数组进行排序
list.stream().sorted(Comparator.comparing(SeriesData::getName));
复制代码
其中
sorted()
函数需要传入一个Comparator,而我们使用了Comparator中的静态方法comparing()
构建了一个Comparator。在构建Comparator的时候comparing()
需要传入一个函数的引用作为参数,也就是SeriesData::getName
。
SeriesData类如下:
public class SeriesData {private Object name;public void setName(Object name) {this.name = name;}public Object getName() {return name;}
}
复制代码
这时出现两个错误:
Error:(343, 86) java: no suitable method found for comparing(SeriesData::getName)method java.util.Comparator.<T,U>comparing(java.util.function.Function<? super T,? extends U>,java.util.Comparator<? super U>) is not applicable(cannot infer type-variable(s) T,U(actual and formal argument lists differ in length))method java.util.Comparator.<T,U>comparing(java.util.function.Function<? super T,? extends U>) is not applicable(inferred type does not conform to upper bound(s)inferred: java.lang.Objectupper bound(s): java.lang.Comparable<? super java.lang.Object>,java.lang.Object)
复制代码
Error:(343, 97) java: invalid method referencenon-static method getName() cannot be referenced from a static context
复制代码
Q1
第一个错误就是说,向comparing()
方法中传入的参数类型是错的。为什么是错的呢? 首先先来看看comparing()
这个函数的实现:
public static <T, U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T, ? extends U> keyExtractor) {Objects.requireNonNull(keyExtractor);return (Comparator<T> & Serializable)(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}
复制代码
第一眼:WTF!,这是什么鬼,根本看不懂啊,那就赶紧好好补补课!
首先这是一个静态方法,其次,这是泛型方法。
static后面的
<T, U extends Comparable<? super U>>
,这是泛型方法的泛型参数声明部分,意思是:方法中有一种没有任何限制的参数类型T,另一种参数是实现了Comparable<? super U>接口的类U。comparing()
方法接受一个参数:Function<? super T, ? extends U> keyExtractor
,这是一个函数引用,所引用的函数需要传入一个参数T,并返回一个U或他的子类。
这是要注意U是如何限定的:实现了Comparable<? super U>接口的类
而在上面的程序中的引用方法SeriesData::getName
,返回的是Object
,很遗憾它没有实现Comparable
接口,所以也就出现了第一个错误。
Q2
第二个错误看似很好理解:“静态上下文中无法引用非静态方法无法”,getName
是一个非静态的方法,而comparing()
则是静态的,这导致问题无可厚非。But,很怪异的是,当我把getName
的返回值改为String
后就不会出现上述的问题了,找了好久没找到原因。
另外,也尝试了其他例子,只要是在静态方式中使用非静态方法都会出现“non-static method cannot be referenced”这个错误。
public static Integer fun2(String a) {System.out.println(a);return Integer.valueOf(a);
}public static void fun1(Function<String, Integer> ac) {Stream.of("1", "2", "4").map(x -> ac.apply("1"));
}public static void main(String[] args) {fun1(StorageAreaAction::fun2);
}
复制代码
如果把fun2()
中的static
去掉则会报错。
猜测: 难道是因为setter
方法的原因?
如果有哪位大神知道的话还请不吝赐教。
Continuing...
Java8 Stream()引发的“non-static method cannot be referenced from a static context”相关推荐
- 【错误】Non-static method*** cannot be referenced from a static
错误:Non-static method*** cannot be referenced from a static context 造成原因:实例化对象后,没有通过对象调用方法. *解决方法1:直接 ...
- MyBatisPlus Non-static method cannot be referenced from a static context
在使用 LambdaQueryWrapper 构建查询参数的时候,提示 Non-static method cannot be referenced from a static context // ...
- Non-static method ‘*‘ cannot be referenced from a static context 错误分析
字面意思是无法从静态上下文引用非静态方法 报错图片和信息 后来发现直接使用类去调类中的方法,但是方法并非静态方法 是无法使用类去调取的. 解决方案: 1.将方法设置成静态方法 2.注入类 使用实例调用 ...
- Java8 stream().map()将对象转换为其他对象
Java8 stream().map()将对象转换为其他对象 1: 将对象List转为List public class user{private String name;private String ...
- Java8 Stream用法总结
Java8 Stream Stream 总览 什么是流 流的构成 流的构造与转换 构造流的几种常见方法 流转换为其它数据结构 中间操作符 map mapToInt mapToLong.mapToDou ...
- Java8 Stream性能如何及评测工具推荐
点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作为技术人员,学习新知识是基本功课.有些知识是不得不学,有些知识是学了之后如虎添翼,Java ...
- JAVA8 Stream方法使用详解reduce、IntStream(二)
文章目录 一 归约 1.元素求和 2.最大值和最小值 二.数值流 1.映射数值流 2.转换对象流 3.数值范围 三.构建流 1.由值创建流 2.由数组创建流 3.由文件生成流 4.由函数生成流 此章节 ...
- 怎么break java8 stream的foreach
文章目录 简介 使用Spliterator 自定义forEach方法 总结 怎么break java8 stream的foreach 简介 我们通常需要在java stream中遍历处理里面的数据,其 ...
- java8 stream案例分析
java8 stream Stream是java8 推出的一个处理集合类的一个全新的接口,在工作当中经常用到,并且他的预发规则与我们平台的有一点不一样,是流式的处理,非常类似RXJava的一个风格. ...
最新文章
- 【C++】拷贝,赋值与构造
- 事物 @Transactional
- [蓝桥杯2016决赛]愤怒小鸟-模拟
- Ubuntu下tftp服务器的搭建
- S2-MLPV2:目前最强的视觉MLP架构,空降榜一,达到83.6% Top-1准确率
- 数字权限管理(DRM)技术
- 读“游戏之旅——我的编程感悟”:难得的休闲读物
- 《精通javascript》5,6章小结(一)
- html5 命运之轮生产
- win8蓝屏错误代码DPC_WATCHDOG_VIOLATION您的电脑遇到错误需要重启修复
- 区块链技术之P2P网络(一)
- mysql的my.cnf常用配置
- 文献综述是什么,该怎么写?
- Excel分列小技巧
- 网络设备网卡、中继器、集线器、网桥、交换机、路由器工作原理
- dic={key:“字典”}
- python安装及使用技巧
- 清华计算机系科学博士毕业论文要求,博士可以不发SCI毕业?清华取消博士论文发表强制要求...
- 【微信公众号H5授权登录】
- C语言中的自定义函数
热门文章
- 学成在线首页——静态页面基础项目(HTML+CSS)【学习笔记】
- tomcat组播实现session一致性_java会话技术-Session
- DID会固定年份吗_倍分法DID详解 (二):多时点 DID (渐进DID)
- 低代码开发平台_如何挑选最适合你的低代码开发平台
- python cocos2dx_cocos2dx 3.0 环境搭建、项目编译于运行
- 如何在程序中画出实际大小为7CM半径的圆
- linux启动关闭脚本,Linux中启动/停止/重启/状态的startup脚本
- 只在用户登陆时运行_linux 系统的7个运行级别
- 机器学习、AI那么火,千万小心别掉进前人的坑
- 机器学习入门系列:关于机器学习算法你需要了解的东西、如何开发机器学习模型?...