3

我看过这篇文章Java instantiate Short object in Java但并没有完全响应我正在寻找的内容。

有谁知道为什么第一行 (//1) 给出错误而第二行 (//2) 没有

  Short s = new Short(4);//1

    short s1 = 4;//2 Here I know why it works it gets
 //implicitly narrow converted into a short. 

如代码中所述,我理解为什么第二行可以正常工作,但是第一行呢?写作的意义在哪里Short s = new Short((short)4); 底线:为什么它不隐含地投射它?它是一个常数而不是一个变量。

提前致谢。

4

5 回答 5

3

您可以定义一个构造函数采用“short”,另一个采用“int”,语言语义会使您对构造函数的调用模棱两可。所以你需要使用严格类型。此外,由于 Short 是最终的,请尝试使用 Short.valueOf((short) 4) 以避免不必要的对象分配。

于 2013-03-05T18:20:47.977 回答
2

这是因为 Java 使用“搜索机制”来查找 int 类型的构造函数。当您为 varialbe 赋值时,它的类型被定义并且编译器可以优化代码。使用构造函数(或任何其他方法)这是不可能的。

于 2013-03-05T18:17:20.400 回答
2

当你说

Short s = new Short(4);

您指定的是整数文字,而不是短文字,并且在Java 语言规范中4是不允许的Method Invocation Conversion 。

然而,当你说

short s1 = 4;

这取决于 Java 语言规范所称的Narrowing Primitive Conversion,即使它会失去精度也是允许的。

于 2013-03-05T18:21:35.717 回答
1

你应该像下面这样:

 Short s = new Short((short) 4);

原因: 4 的类型是 Integer/int 而不是 Short。因此,您需要进行显式类型转换以确保 Short 构造函数采用兼容类型。

于 2013-03-05T18:19:16.630 回答
0

只是不支持。

对于其他数字对象类型,值有一个文字,数字默认为 int,但很长一段时间你有 L 后缀,double 有 d 等等。

如果您要让 new Short(int) 抛出异常,则构造函数将与其他数字构造函数不一致。

尝试创建一个太大的短原语在编译时进行测试,与字节相同。

如果你这样做:

byte b = 1000000;

您的代码不会编译,而是抛出异常。

因此,当您考虑编译器时,行为是一致的。

于 2013-03-05T18:20:03.530 回答