为什么这会给出编译时错误?2在编译时是恒定的,因此这里应允许缩小,因为2在字节范围内.
public class Test {
public static void main(String[] args) {
ForTest test=new ForTest();
test.sum(1, 2); //compile time error here
}
}
class ForTest
{
public int sum(int a,byte b)
{
System.out.println("method byte");
return a+b;
}
}
Run Code Online (Sandbox Code Playgroud)
错误是:ForTest类型中的方法sum(int,byte)不适用于arguements(int,int).
编辑:我认为答案就在这里:http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.3但我没有得到它:(
您必须区分赋值转换和方法调用转换.
缩小原始转换
首先,看看JLS§5.1.3:
原始类型的22个特定转换称为缩小基元转换:
[...]
int到byte,short或char
[...]
请注意,这只能解释机制,而不能解释允许或不允许此类转换的位置.
作业转换
接下来,看看JLS§5.2:
[...]
此外,如果表达式是byte,short,char或int类型的常量表达式(第15.28节):
- 如果变量的类型是byte,short或char,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示.
[...]
这清楚地描述了在赋值中允许byte b = 2从int类型到类型byte的缩小转换.
方法调用转换
但是,在阅读JLS§5.3时,您不会阅读有关缩小转换的任何内容.所以编译器正在做正确的工作.