【问题标题】:Java: why the "long" primitive type does not accept a simple number?Java:为什么“长”原始类型不接受简单数字?
【发布时间】:2015-04-05 20:23:27
【问题描述】:

我有一个接收long 类型参数的方法,我尝试通过1 调用它:

contato.setId(1);

我收到了这个:

The method setId(Long) in the type Contato is not applicable for the arguments (int).

但是,1 不也是一个长数字吗?不是在长范围之内吗?

PS:顺便说一句,我用这段代码解决了问题:

Integer y = 1;
long x = y.longValue();
contato.setId(x);

这只是一个教学问题。

【问题讨论】:

  • 如果该方法接受了 little-l long,它就可以正常工作;只是 int 文字不能直接自动装箱到Long
  • How did a float turn into a double here? 的可能重复项 - 我的回答解释了 Louis 评论中提到的自动装箱限制背后的决定

标签: java casting int long-integer primitive-types


【解决方案1】:

你应该使用contato.setId(1L);(注意“L”后缀)

文字“1”表示一个原始的int 值,它被强制转换为java.lang.Integer 包装类。

【讨论】:

    【解决方案2】:

    long 是包含 64 位的数据类型(不要与 Long 的对象混淆!)与 int(32 位),因此您不能使用从 int 到 @987654327 的简单赋值@。见:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

    为了了解如何声明各种数据类型,您应该特别检查following table

    Datatype    Default Value
    byte        0
    short       0
    int         0
    long        0L
    float       0.0f
    double      0.0d
    char        '\u0000'
    Object      null
    boolean     false
    

    因此,对于您的情况,long 应声明为数字后跟 L,例如:

    long x = 100L;
    

    此外,用autoboxing 做你正在做的事情:

    Integer y = 1;
    long x = y.longValue();
    

    不仅没有必要,而且非常浪费。因此,例如,如果您将在循环中(多次)执行此操作,您的代码将按数量级变慢!

    【讨论】:

      【解决方案3】:

      Long 不是原始类型,long 是。当使用包装类而不是原始类型时,您需要通过添加 L 后缀向编译器明确指出传递的参数是 long

      contato.setId(1L);
      

      或者您可以简单地更改 setId 方法,使其采用原始的 long 参数。

      【讨论】:

      • setId 参数类型上的大写“L”也有可能是拼写错误,正确的解决方法是使其采用原始long
      【解决方案4】:

      setId 采用大写字母-L Long,它是 Java 对小写字母-l long(也称为 64 位整数)的包装。正因为如此,Java 很容易知道如何将long 转换为Long,而无需您做任何特别的事情。因此,就像其他答案所说的那样,您可以简单地执行setId(1L),这就是给它一个long,它很容易将其转换为Long

      但是,如果必须使用 32 位 int,则必须先将其转换为 longLong,以便 Java 知道如何处理它。你看,Java 不知道如何将小写字母-i int 转换为大写字母-L Long,只转换为大写字母-I Integerint 周围的包装类)。

      所以,假设你的 int 的名字是 i,你也可以使用这些:

      setId((long)i);         // Cast your int to a long, which Java can turn into a Long
      setId((Long)(long)i);   // Cast your int to a long, then that long to a Long
      setId(new Long(i));     // Create a new Long object based on your int
      setId(Long.valueOf(i)); // Get the Long version of your int
      

      【讨论】:

        猜你喜欢
        • 2010-11-01
        • 2021-07-06
        • 1970-01-01
        • 2012-06-18
        • 1970-01-01
        • 2013-01-06
        • 2011-11-01
        • 1970-01-01
        相关资源
        最近更新 更多