class LongTest
{
public static void main(String[] args) 
{
Long l=1;
System.out.println("Hello World!");
}
}
报错信息:
E:\code\java>javac LongTest.java
LongTest.java:5: 错误: 不兼容的类型
                Long l=1;
                       ^
  需要: Long
  找到:    int
1 个错误最近在看JAVA基础,其实上面说得很清楚了,整数型默认是int,long型值后面要加上l或L,java才会把它当long
但是我现在声明的变量就是一个long型的,这还不清楚吗?
为什么非要在值后面加l?longint默认

解决方案 »

  1.   

    这个需要需要: Long
      找到:    int它在哪里找的int?
    不是说主数据类型变量的值,直接是个二进制存吗?
    难道在Long l=1;的时候放入的是一下4个字节的二进制码?
      

  2.   

     Long l=1;(Long不是长整型long)
    Java区分大小写,Long和long是两个不同的类型
    你的程序中应该把Long改为long
     long l=1;
      

  3.   

    相当于Long l = new Integer(1)
    java编译器会自动装箱。
    这两个对象的类型不匹配。
      

  4.   

    long和Long不一样,如果是long l=1;是没有问题的,自动转型int to long,但Long是long的包装类。
    包装类的自动装箱与拆箱只能与对应的基本类型之间,基本类型之间要人工转型,你的改为Long l=1l;或者Long l=(long)1;就可以了。1默认为int型,1l才是long型。
    多看看书再问吧,再有问题可以继续问
      

  5.   

    谢谢楼上的,我果然脑残了,不过我又把程序改了下long l=4000000000;4000000000在long的取值范围内,但是报错了E:\code\java>javac LongTest.java
    LongTest.java:5: 错误: 过大的整数: 4000000000
                    long l=4000000000;
                           ^
    所以还是回到最开始的时候,为什么它要说4000000000过大?我把程序改成long l=4000000000l;就通过编译了
      

  6.   

    这问题不至于这么纠结吧。。
    因为1是int,不回auto-box成Long;1L才是long,可以auto-box成Long。
      

  7.   

    装箱什么的也一直没弄清楚过啊,不过我最想问的还是为什么明明声明了是个long了,8个字节
    但是还非要在值后面加个L标明是长整型
    java是怎么弄的?主数据变量的值是直接存的字节啊~~!
    难道默认存的4个字节?
      

  8.   

    "主数据变量是以字节来表示实际的变量值"这是head first java 的原文,第54页
      

  9.   

    难道主数据类型的大小,是值来指定的?
    JAVA通过值的大小来确定变量的大小?
    omg,那声明的时候数据类型不是个摆设吗?坑爹的玩意
      

  10.   


    4000000000是整型,只有在4000000000后加l或L(4000000000l或4000000000L)编译器才会把它当长整型处理,
     long l=4000000000;
    此语句可解析为把整型4000000000赋值给长整型l,而4000000000超出了int的取值范围,所以报错
      

  11.   

    你把Long换成long就不是摆设了
      

  12.   


    但是Short s = 1;这个可以通过编译
    为什么JAVA没把1也当整型呢?
      

  13.   

    Short s = 1;
    此语句可解析为把整型1赋值给短整型s,而1既在int的取值范围,也在Short的取值范围,所以不报错
      

  14.   


    感觉这种解释还是不对因为float f=1.1;报错:
    E:\code\java>javac FloatTest.java
    FloatTest.java:5: 错误: 可能损失精度
                    float f=1.1;
                            ^
      需要: float
      找到:    double
    1 个错误如果按你的解释的话,就是将双精度1.1赋值给单精度f,而1.1即在双精度的取值范围,又在单精度的取值范围,但是此例还是报错,说明JAVA不是那样做的
      

  15.   

     double类型不能转换成float类型,因为有可能损失精度,所以需要进行强制转换
       float f=(float)1.1;
    而短整型转整型不用考虑精度问题,所以:short s = 1;等同于short s = (short)1;
    但如果int类型的值超出short类型,还是需要进行强制转换的,如:
    short s = (short)1;
      

  16.   

     double类型不能转换成float类型,因为有可能损失精度,所以需要进行强制转换
       float f=(float)1.1;
    而短整型转整型不用考虑精度问题,所以:short s = 1;等同于short s = (short)1;
    但如果int类型的值超出short类型,还是需要进行强制转换的,如:
    short s =32768;(报错)
    short s = (short)32768;(不报错)
    但这是s的值为-32768
      

  17.   


    感觉这种解释还是不对因为float f=1.1;报错:
    E:\code\java>javac FloatTest.java
    FloatTest.java:5: 错误: 可能损失精度
                    float f=1.1;
                            ^
      需要: float
      找到:    double
    1 个错误如果按你的解释的话,就是将双精度1.1赋值给单精度f,而1.1即在双精度的取值范围,又在单精度的取值范围,但是此例还是报错,说明JAVA不是那样做的     s=1
      

  18.   

    float 那个例子倒是可以解释,因为计算机的浮点数并不精确,所以你写成了1.1,系统并不知道你的意思是一个float还是一个double。比如如下代码:
    System.out.println(1.1 == 1.0999999999999999999);
    将会输出true至于Short s = 1; 这个情况,我觉得可能是一种语法糖。因为我网上找到的所有资料无一例外都是说需要(short)的转换。我想可能是编译器在看到这个值的取值范围在short之内时,就自动转换成short了。但是默认的整型类型,仍然是int,所以不能自动装箱成Long
      

  19.   


    不对,short s = 1;这个例子是整型转短整型,四个字节转两个字节,没有报错
    但是,float f=1.1;这个例子是双精度转单精度,八个字节转四个字节,同样是高转低,但报错了,为啥子
    你举的short s =32768;(报错)这个例子属于超过取值范围的问题了,先不讨论这个
      

  20.   


    系统知道哦,你看它报得错:
    报错:
    E:\code\java>javac FloatTest.java
    FloatTest.java:5: 错误: 可能损失精度
                    float f=1.1;
                            ^
      需要: float
      找到:    double
    1 个错误
      

  21.   


    浮点型赋值的时候,java默认是双精度,所以报错上面说,找到double,需要float
    它为什么不像short s=1;的时候那样,自动判断一下呢?
      

  22.   

    因为我刚才说过,Java并不能判断1.1是float还是double,因为它和1.0999999999999999999相等,而1.0999999999999999999是一个double。float和double除了取值范围之外还有精度的差别,而short和int就只有取值范围的差别