日期:2014-05-20  浏览次数:20798 次

Long l=1;为什么通不过?

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?
long int 默认

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

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

------解决方案--------------------
Short s = 1;
此语句可解析为把整型1赋值给短整型s,而1既在int的取值范围,也在Short的取值范围,所以不报错
------解决方案--------------------
float 那个例子倒是可以解释,因为计算机的浮点数并不精确,所以你写成了1.1,系统并不知道你的意思是一个float还是一个double。比如如下代码:
System.out.println(1.1 == 1.0999999999999999999);

将会输出true

至于Short s = 1; 这个情况,我觉得可能是一种语法糖。因为我网上找到的所有资料无一例外都是说需要(short)的转换。我想可能是编译器在看到这个值的取值范围在short之内时,就自动转换成short了。但是默认的整型类型,仍然是int,所以不能自动装箱成Long