【问题标题】:Use ClassName::new (java 8) to generate a class instance failed使用 ClassName::new (java 8) 生成类实例失败
【发布时间】: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


【解决方案1】:

完美配合设置:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.16.10</version>
</dependency>

“IntelliJ IDEA 2016.3 Build #IU-163.7743.44,于 11 月 17 日构建, 2016 JRE:1.8.0_112-release-408-b2 amd64 JVM:OpenJDK 64 位服务器虚拟机 由 JetBrains s.r.o "

【讨论】:

    猜你喜欢
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    相关资源
    最近更新 更多