任何人都知道为什么编译器不能在'short'中输出值'7'?显式转换正在工作但是在传递参数时它不起作用!!!
class Alien {
String invade(short ships) { return "a few"; }
String invade(short... ships) { return "many"; }
}
public class Wind {
public static void main(String [] args) {
short temp = 7;
System.out.println(new Alien().invade(7));
}
}
答案 0 :(得分:5)
整数文字(这是我们在这里讨论的)是int
值,除非它们有一个后缀来表示它们是long
值。< / p>
来自section 3.10.1 of the specification:
如果整数文字后缀为ASCII字母L或l(ell),则其长度为long;否则它的类型为int(§4.2.1)。
但是铸造很好。它也完全有可能有一个不是文字的常量。例如:
public static final short THIS_IS_A_SHORT = 7;
此处THIS_IS_A_SHORT
是short
类型的常量。在这种情况下,你甚至不需要演员,因为它是一个任务。作业受JLS section 5.2约束,其中包括:
如果变量的类型是byte,short或char,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示。
方法参数不受分配转换的影响。
答案 1 :(得分:1)
默认情况下,整数文字在java中被视为int基本类型。
invade(7)
使用int
类型的参数查找方法入侵。
答案 2 :(得分:1)
因为整数常量是int
类型常量。因此7
自我int
不变。
<强> UPD:强>
当Java搜索要调用的方法时,它会搜索某种方法原型。在你的情况下它是invade(int)
并且没有任何具有这种参数类型的方法。仅限invade(short)
和invade(short...)
。
当您创建新变量时,即short temp = 7;
Java“理解”7
是短值并允许分配而不进行转换。
答案 3 :(得分:0)
Java将任何Integer文字视为int,并且没有任何带有此类参数的方法。另一方面,java没有进行自动向下转换,因为它可能导致数据丢失和标记错误。
如果您执行以下更改。虽然你在调用方法时传递的时间很短,但是在上传中没有任何损害,java会为你做这件事。产生输出“几个”
class Alien {
String invade(int ships) { return "a few"; }
String invade(int... ships) { return "many"; }
}
public class Wind {
public static void main(String [] args) {
short temp = 7;
System.out.println(new Alien().invade(temp));
}
}
答案 4 :(得分:0)
JAVA是故意写的不是短文字:
Why are there no byte or short literals in Java?
http://www.velocityreviews.com/forums/t149350-java-byte-literals-and-short-literals.html
<小时/>
7是int
字面值,但不能直接用作short
字面值。你只需要这个:
System.out.println(new Alien().invade((short) 7));
答案 5 :(得分:0)
class Alien {
String invade(short ships) { return "a few"; }
String invade(short... ships) { return "many"; }
}
public class Wind {
public static void main(String [] args) {
short temp = 7; // the variable temp get a value of 7
System.out.println(new Alien().invade(temp)); // but 7 is not short by default,
// so use variable temp instead of 7
}
}