2

有人知道为什么编译器不能在“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));
    }
}
4

6 回答 6

5

整数字面量(这就是我们在这里讨论的)是int值,除非它们有一个后缀来表明它们是long值。

规范的第 3.10.1 节

如果整数文字以 ASCII 字母 L 或 l (ell) 为后缀,则它是 long 类型;否则它是 int 类型(§4.2.1)。

但是选角很好。也完全有可能有一个不是文字的常量。例如:

public static final short THIS_IS_A_SHORT = 7;

THIS_IS_A_SHORT是一个类型的常量short。在这种情况下,您甚至不需要演员表,因为这是一项任务。作业受JLS 第 5.2 节的约束,其中包括:

如果变量的类型是 byte、short 或 char,并且常量表达式的值可以用变量的类型表示,则可以使用窄化原语转换。

方法参数不受赋值转换的影响。

于 2013-01-10T18:07:24.533 回答
1

默认情况下,整数文字在 java 中被视为 int 原始类型。

invade(7)寻找具有类型参数的方法入侵int

于 2013-01-10T18:06:13.967 回答
1

因为整数值常量是int类型常量。因此7,self 是一个int常数。

UPD: 当 Java 搜索要调用的方法时,它会搜索某种方法原型。在您的情况下,invade(int)并且没有任何具有此类参数类型的方法。只有invade(short)invade(short...)

当您创建一个新变量时,即short temp = 7;Java“理解”它7是一个短值并允许在没有强制转换的情况下进行赋值。

于 2013-01-10T18:07:00.713 回答
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));
  }
}
于 2013-01-10T18:11:36.947 回答
0

JAVA 被故意写成没有短文字:

为什么 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));
于 2013-01-10T18:14:38.953 回答
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
    }
}
于 2013-05-04T19:27:19.607 回答