【问题标题】:passing null in object constructor for property of type long [duplicate]在对象构造函数中为 long 类型的属性传递 null [重复]
【发布时间】:2016-09-29 08:33:58
【问题描述】:

我有一个 MyClass 类,它有两个属性,一个是 String 类型,一个是 long 类型(我使用 lombok 来拥有所有参数构造函数)

@AllArgsConstructor
public class MyClass{
    private String sth;
    private long id;

    //some methods
}

现在在我的测试工厂类中,我想要创建MyClass 对象的方法,其中String 设置为某物,id 设置为空

public static MyClass getMyClassWithNullId() {
        return new Myclass("some string", null);
}

但是上面的代码无法编译: The constructor MyClass(String, null) is undefined

为什么我不能将 null 传递给 long? (任何 long 值而不是 null 都是正确的)

编辑:MyClass 的私有字段 id 应该是 Long 而不是 long,这解决了所有问题

【问题讨论】:

  • 使用Long 而不是long。基元不访问空值。
  • 您可以按照@Eran 的建议使用对象类型Long 而不是原始类型long。但请注意,如果您尝试在涉及autoboxing 的算术表达式中使用此 Long 值,您将得到NullPointerException
  • @RafaelOsipov 自动装箱与它有什么关系?? ;)
  • 您没有提供任何构造函数。当有人为 id 提供 null 时会发生什么,您会将字段 id 分配为什么?
  • 正如@Eran 所说,当我再次阅读我的问题时,我注意到我使用了小写long,这是原始的而不是warper 类Long

标签: java long-integer


【解决方案1】:

你的构造函数应该看起来像

public void MyClass(String str,Long param){}

然后像new MyClass("hello",null);这样的调用将是有效的

【讨论】:

  • 或者他用 ("hello", 0) 调用它。你的回答听起来像是解决他问题的唯一方法。
  • 0 与 null 不同
  • @GhostCat 0 表示一个值,null 表示不引用此实例,我希望您对此很清楚。
  • 这取决于他想要 id 的意思。如果他意味着它是一个long,那么传递null就没有意义了。您假设他尝试传递 null 意味着他应该使用 Long。我只是说,也许他不知道自己在做什么。然后您的解决方案与传递 0 的值相同。
  • @GhostCat 和你也在做一些战略假设。如果(id ==null) 可能id 将被自动生成......简单的用例。至于“也许 null 与传递 0 相同”的假设 - 是的,也许。但这与问题无关。
【解决方案2】:

好吧,没关系,long 是原始类型,不能为空,使用 warper 类 Long 解决了它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    相关资源
    最近更新 更多