JAVA中类型转换的基本原则在于,(布尔型除外,无法转换)低精确度或者说小范围的类型可以自动地转为高精度或者大范围的类型,反之则需要强制转换。如图所示,左边的类型可以自动转换为右边的类型(一般发生在与大范围的类型的运算中),反之则需要强制转换。
图片来源(http://www.cnblogs.com/lwbqqyumidi/p/3700164.html)
如下题LeetCode 400. Nth Digit中,第七行会报错,可以看到count是long,len是int,两数相乘时len会自动变为long,而n是一个int值,把long类型赋给int类型就会报错。
public class Solution {
public int findNthDigit(int n) {
int len=1;
long count=9;
int start=1;
while(n>len*count){
n=n-len*count; //这里会报错error: incompatible types: possible lossy conversion from long to int,因为没有进行long->int的强制转换
len+=1;
count=count*10;
start=start*10;
}
start=start+(n-1)/len;
String s=Integer.toString(start);
return Character.getNumericValue(s.charAt((n-1)%len));
}
}
有两种解决办法,第一是换成n-=len*count。 -=这种符号会自动地进行强制转换(+=,*=也是一样)。第二种方法是换成 n=(int)(n-len*count); 也就是加上强制转换。二者其实是一样的。