【发布时间】:2016-11-26 14:30:41
【问题描述】:
上下文是:
- IDE:智能
- 使用 Lombok @Data @AllArgsConstructor 注释我的模型类
-
编译正常,但运行以下情况失败。
/** This is the model class */ @Data @AllArgsConstructor class Message { public Long id; public String name; } /** This is a test case */ @Test public void testConstructRef() { BiFunction<Long, String, Message> constructFunc = Message::new; Message msg = constructFunc.apply(1L, "this is a message"); assertEquals(1L, (long) msg.getId()); assertEquals("this is a message", msg.getName()); }
在 IDE 中,Message 构造函数和 getter/setter 都在那里。 编译正常,但运行失败。
所以我的问题是:
- 是 Intellij 问题还是 lombok 问题还是 java 8 问题?
- 以前有人遇到过这种情况吗?如果我必须使用 lombok,如何解决? (如果我手动编写constructor/getter/setter,它可以成功运行。)
顺便说一句,运行错误是:
Error:(40, 63) java: incompatible types: invalid constructor reference
constructor Message in class java8.methodref.TestDemo.Message cannot be applied to given types
required: no arguments
found: java.lang.Long,java.lang.String
reason: actual and formal argument lists differ in length
Error:(43, 40) java: cannot find symbol
symbol: method getId()
location: variable msg of type java8.methodref.TestDemo.Message
Error:(44, 50) java: cannot find symbol
symbol: method getName()
location: variable msg of type java8.methodref.TestDemo.Message
【问题讨论】:
-
错误是什么?
-
错误:(40, 63) java: 不兼容的类型: 无效的构造函数引用构造函数 java8.methodref.TestDemo.Message 类中的消息不能应用于所需的给定类型:找不到参数:java.lang。 Long,java.lang.String 原因:实际参数列表和形式参数列表长度不同错误:(43, 40) java:找不到符号符号:方法 getId() 位置:java8.methodref.TestDemo.Message 类型的变量 msg 错误: (44, 50) java: 找不到符号 symbol: 方法 getName() 位置: java8.methodref.TestDemo.Message 类型的变量 msg
-
对我来说完美无缺。 “IntelliJ IDEA 2016.3 Build #IU-163.7743.44,于 2016 年 11 月 17 日构建 JRE: 1.8.0_112-release-408-b2 amd64 JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o”
-
@pivovarit 我会用你的环境参数试试。你的龙目岛版本是什么? (我的是:lombok-1.16.8.jar)
-
@JasonS 1.16.10 为了清楚起见,我包含了完整的答案
标签: intellij-idea lambda java-8 lombok method-reference