错误:不兼容的类型:从int到short的可能有损转换.我不知道为什么我收到此错误消息

MAH*_*ESH 5 java

public class Demo 
{
    public static void main(String[] args) 
    {
       int a=10,b=20;
       short c = (a<b)?a:b;
       System.out.println(c);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的程序,我得到以下错误,为什么我没有得到

"Demo.java:6: error: incompatible types: possible lossy conversion from int to short
short c = (a<b)?a:b;
1 error" 
Run Code Online (Sandbox Code Playgroud)

我用变量声明写"final",它工作正常.但为什么会这样呢?

public class Demo 
{
    public static void main(String[] args) 
    {
        final int a=10,b=20;
        short c = (a<b)?a:b;
        System.out.println(c);
    }
}
Run Code Online (Sandbox Code Playgroud)

Swe*_*per 2

这是在 Java 语言规范\xc2\xa75.2 赋值上下文中指定的:

\n
\n

赋值上下文允许使用以下之一:

\n

...

\n

另外,如果表达式是 byte、short、char 或 int 类型的常量表达式 (\xc2\xa715.28):

\n
    \n
  • 如果变量的类型是byteshort、 或char,并且常量表达式的值可以用变量的类型表示,则可以使用缩小基元转换。
  • \n
\n
\n

在第二个代码片段中使用的带有三元运算符的表达式是常量表达式,因为该表达式中使用的所有变量都是final。此外,10可以表示为short. 因此,允许从int到 的缩小原始转换。short

\n

这是有道理的,不是吗?编译器知道最终变量的所有值,因此这肯定是允许的。

\n

然而,在第一种情况下,ab不是常量变量,因此(a<b)?a:b也不是常量表达式,因此需要显式转换:

\n
short c = (short)((a<b)?a:b);\n
Run Code Online (Sandbox Code Playgroud)\n