我有一个java程序,我想在这里讨论并得到你的想法和意见
public class StackFriends {
public static void go(short n) {
System.out.println("short");
}
public static void go(Short n) {
System.out.println("SHORT");
}
public static void go(Long n) {
System.out.println("LONG");
}
public static void main(String[] args) {
Short y = 6;
int z = 7;
go(y);
go(z);
}
}
为什么会出现编译时错误?
是因为对于go(y)和go(z),编译器无法决定是调用go(Long n),go(Short n)还是go(short n)?
< / LI>是声明
Short y = 6;
有效?如果它有效,public static void go(Short n)
- 只接受Short类型的包装器对象?
请告诉我包装类的行为方式,以及在这种情况下它们可以作为参数的可能值吗?
我知道我可以做更多的研究并自己找到它,但是单独使用编译器会有点孤独,我只是想讨论它并学习,它给了很多乐趣。 / p>
答案 0 :(得分:2)
注意:此答案不会涵盖代码中的拼写错误,例如System.out.println("SHORT")
之后缺少的分号(;)或类似内容。
是因为对于
go(y)
和go(z)
,编译器无法决定是调用go(Long n),go(Short n)还是go(short n)
?
编译器可以选择使用哪种方法。原因如下:
short
是原始类型。Short
是一个类,而不是基本类型,因此short
和Short
变量的方式不同,编译器可以选择使用哪个。Long
是long
的包装类,而Long
不是 a Short
(不要通过is-a测试)并且short
无法自动装箱到Long
。对go(z)
的调用无法编译,因为编译器无法自动将int
变量缩小为short
。在此之后,int
无法自动生成,也不能Short
也不能Long
,因此没有可以接收int
的有效方法。如果你想通过go(short)
,你需要做一个明确的演员:
go((short)z);
是声明
Short y = 6;
有效吗?
没有,它̶任何̶i̶s̶n̶'̶t̶.̶面值整数数值变量被转换成̶̶i̶n̶t̶
̶̶v̶a̶r̶i̶a̶b̶l̶e̶.̶̶̶i̶n̶t̶
̶̶c̶a̶n̶n̶o̶t̶是̶a̶u̶t̶o̶b̶o̶x̶e̶d̶到̶̶S̶h̶o̶r̶t̶
̶, ̶所以这就提出了一个编译器̶e̶r̶r̶o̶r̶.̶使它编译,̶添加类型强制转换为̶̶s̶h̶o̶r̶t̶
̶第一:̶
是的,确实如此。这是因为字面值将自动从int
输入到short
,然后自动装箱到Short
。此外,文字整数值6
适合short
变量的值范围。如果您的文字值超出范围,您将收到编译器错误:
Short s1 = 6; //compiles fine
Short s2 = 32768; //compiler error
请告诉我包装类的行为方式,以及在这种情况下它们可以作为参数的可能值吗?
这是非常广泛的。阅读有关它的教程。以下是相关的官方教程:
答案 1 :(得分:1)
public static void go(Short n)
{
System.out.println("SHORT")
}
应该是(你忘了半结肠)
public static void go(Short n)
{
System.out.println("SHORT");
}
您也可以致电
go(z);
z为int,但没有
public static void go(int n)
仅限long
,short
和Short
。我添加了半冒号并更改了
int z = 7;
要
Long z = 7L;
它会为我编译。上面两个问题是我发现的唯一会引发编译时问题的问题,如果你修复这些问题,你的编译时问题就会得到解决。
将int z
更改为long z
的解决方案是:
public class StackFriends {
public static void go(short n) {
System.out.println("short");
}
public static void go(Short n) {
System.out.println("SHORT");
}
public static void go(Long n) {
System.out.println("LONG");
}
public static void main(String[] args) {
Short y = 6;
Long z = 7L;
go(y);
go(z);
}
}
您还可以添加其他go()
功能来接受int
public static void go(int n) {
System.out.println("INT");
}
完整代码为
public class StackFriends {
public static void go(short n) {
System.out.println("short");
}
public static void go(Short n) {
System.out.println("SHORT");
}
public static void go(Long n) {
System.out.println("LONG");
}
public static void go(int n) {
System.out.println("INT");
}
public static void main(String[] args) {
Short y = 6;
int z = 7;
go(y);
go(z);
}
}
答案 2 :(得分:0)
在方法;
print
语句后添加go(Short n)
public static void go(Short n) {
System.out.println("SHORT");
}
定义方法go()
以将整数作为参数
public static void go(int n) {
System.out.println("int");
}