Java转换错误?

时间:2013-01-10 18:05:20

标签: java casting downcast

任何人都知道为什么编译器不能在'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));
    }
}

6 个答案:

答案 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_SHORTshort类型的常量。在这种情况下,你甚至不需要演员,因为它是一个任务。作业受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
    }
}