【问题标题】:@Data annotion not working to set the value in Java@Data 注释无法在 Java 中设置值
【发布时间】:2022-01-25 06:28:01
【问题描述】:

我有这个 POJO 类:

import lombok.Data;
import lombok.Getter;
import lombok.Setter;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import java.io.Serializable;

@Data
@XmlAccessorType(XmlAccessType.FIELD )
public class FulfillmentOrder implements Serializable {

    private static final long serialVersionUID = 1L;

    @XmlElement(name="orderNbr")
    Integer orderNbr;

    public Integer setOrderNumbr(Integer orderNbr) {
        this.orderNbr=orderNbr;
        return orderNbr;
    }
}

我正在尝试从不同的类设置 orderNbr 的值。

FulfillmentOrder fo= new FulfillmentOrder();
Integer orderNum = 
  fo.setOrderNumbr(89898989);

我正在尝试将我的 XML 输出中 orderNbr 的值更新为 89898,我想使用 @Data 来完成。

但是当我在做fo.setOrderNbr(89898989)时,我得到一个编译时错误,错误:(56, 132) java: 不兼容的类型:void 不能转换为 java.lang.Integer,因为 lombok 返回 void。

`fo.setOrderNbr(89898989) 的任何方式来更新值?

【问题讨论】:

  • 这是Java的基础,与Lombok无关。即使是编程的基础知识 - 如果不先为其分配内存,您就无法对对象进行操作。所以你需要改变你的第一行,用FulfillmentOrder fo = new FulfillmentOrder()实例化FulfillmentOrder
  • @JAsgarov 对不起,我忘记添加了,即使添加了,问题也是一样的。
  • 似乎 Lombok 生成的设置器(返回类型为 void)与您的自定义设置器(返回类型为整数)发生冲突。您必须选择一个,或者将您的名称更改为不相同
  • @JAsgarov 我的目的是将 orderNbr 设置为 89898989,因为稍后我将转换为 xml 对象。有没有办法用 lombok 注释做到这一点?
  • 在大多数情况下,setter 返回当前对象的实例(如在构建器中)或 void。返回内部传递的值几乎/没有意义,因为它应该保持不可变。所以也许删除自定义设置器并让 lombok 创建它们。

标签: java lombok


【解决方案1】:

您的问题是您的类实际上有两个具有相同签名的方法。方法的签名是它的名称+参数。所以在你的情况下setOrderNbr(Integer orderNbr)。返回类型不包含在签名中。

正如 Javadoc 中所解释的,在同一个类中具有相同签名的方法是编译时错误。 https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.2

为了让 Lombok 完成这项工作 - 您需要删除您的方法 setOrderNbr(Integer orderNbr) 并调用来自 @Data 的 Lombok 生成的 setter。根据通常的编码实践,它将具有相同的名称但没有返回类型。

如果您坚持使用具有返回类型的 setter,您将必须自己定义它,但它必须具有不同的签名 - 在您的情况下,使用不同的名称以免与 Lombok 使用 @Data 生成的名称发生冲突。

【讨论】:

  • 感谢您的回答,如果我必须在不使用 setOrderNbr(Integer orderNbr) 的情况下将 setOrderNbr 的值设置为 89898989,请您提供代码 sn-p,因为即使我也发现它是多余的但没有setOrderNbr(Integer orderNbr),我得到一个编译时错误,因为 java:不兼容的类型:void 无法转换为 java.lang.Integer。
  • 我觉得你没有阅读/听到我在说什么。只需更改您的方法名称。比如加一个字符。例如,将setOrderNbr 的名称更改为setOrderNumber
  • 我明白你说的,我已经更改了方法名称。但我的问题是,如果我想使用 lombok 本身而不使用 setOrderNumber 来设置 OrderNbr 的值,我该怎么做。我更新了问题以便更好地理解。
  • 就像我回答的最后一段所说,如果您坚持使用返回类型,则必须自己编写该方法。 Lombok 仅生成普通的 getter/setter,与您的 IDE 生成的相同,它们不可自定义,并且 setter 通常没有返回类型
  • 呃,我没有花足够的时间仔细阅读问题。没关系 - 不,不能让 lombok 返回 参数(使用 @Accessors 你可以让 lombok 返回 this)。
猜你喜欢
  • 2012-05-11
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 2011-10-24
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多