【问题标题】:Java type promotion with "expressions"使用“表达式”进行 Java 类型提升
【发布时间】:2013-11-12 11:17:44
【问题描述】:

如果它是唯一位于等号右侧的变量,是否可以将下面的变量(称为 b)称为表达式?

// This code fragment will not compile.
// c is a char, and b is a byte.

c = b;

我之所以问这个问题是因为表达式中的类型提升这个话题。我了解 Java 将所有字节提升为整数。这是该代码片段无法编译的唯一原因吗? (请注意,我知道演员表;这不是本帖的重点。非常感谢。)

编辑: 非常感谢乔恩和彼得。使用第二个示例查看此主题:

byte b = 1;
short s = 2;

s = b;  // OK
s = b*2;  // Not OK (compilation error)

以下情况是真的吗?

(第 3 行)Java 将字节转换为短字节。 (第 4 行)Java 将表达式 b*2 转换为 int。

如果这是正确的,那么 =b;和=b*2;是 Java 以不同方式处理的“表达式”。所以,=b; “表达式”不会转换为 int,而是扩展为 short。但是 =b*2;表达式被转换为一个 int,而不是一个 short,即使名为 s 的目标变量是一个 short。

编辑 2: 还有——

short s1, s2 = 2, s3 = 2;
s1 = s2*s3;  // Not OK (compilation error)

尽管所有三个变量都是短裤,但 s2*s3;表达式被提升为 int,从而导致编译错误。

【问题讨论】:

    标签: java types promotions


    【解决方案1】:

    试试这个

    byte b = -1;
    short s = b; // is ok as a byte can be promoted to an short.
    int i = b; // is ok as a byte can be promoted to an int.
    float f = b; // is ok as a byte can be promoted to an float, long or double.
    
    char c = b; // won't compile
    

    但是

    final byte b = 1;
    char c = b; // compiles fine as the compiler can inline the value.
    

    在这种情况下

    short s = b*2;  // Not OK (compilation error)
    

    b * 2 是 int,因为 2int 值。如果b 是最终的,您将能够这样做,因为编译可以内联该值。

    【讨论】:

    • 最后一部分有JLS吗?我也试过final int b = 1; char c = b; 并且它编译,而final long b = 1; char c = b; 没有编译。
    • 非常感谢。我编辑了我的 O.P. 以讨论示例代码中的第二行;短 s = b;
    • 回复:短 s = b*2。如果您在此行中使用了三条短裤:s1 = s2*s3。 s2*s3 表达式被转换为 int!我现在意识到字节、短裤和字符在表达式中被转换为整数。我还意识到,Java 不会以同样的方式处理包含诸如 short s = b 之类的初始化程序的变量声明。那很有意思。 :)
    • @user2911290 在字节码级别 boolean、byte、short、char、int、float 都使用相同数量的堆栈空间,一个 32 位位置。这些类型在数组或对象中使用不同数量的内存。
    【解决方案2】:

    如果下面的变量(称为 b)是唯一位于等号右侧的变量,是否可以将其称为表达式?

    是的,绝对的。

    我了解 Java 将所有字节提升为整数。

    嗯,在某些情况下。并非在所有种情况下。

    从根本上说,代码无法编译,因为没有从 bytechar 的隐式转换。来自section 5.1.2 of the JLS(扩大原始转换):

    对原始类型的 19 种特定转换称为扩展原始类型转换:

    • byteshortintlongfloatdouble
    • ...

    请注意,从byte 转换的目标类型列表中缺少char

    【讨论】:

      猜你喜欢
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      相关资源
      最近更新 更多