繁体   English   中英

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

[英]error: incompatible types: possible lossy conversion from int to short. I don't know why i'm getting this error message

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

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

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

我用变量声明写“ 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);
    }
}

要回答您的问题,基本上都是在两种情况下将int数据类型向下转换short ,这在Java中是不可接受的。 详细描述如下:

情况1:-

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

在这种情况下,您只是数据类型从int 向下转换short

错误:类型不兼容:可能从int到short的有损转换

情况2:

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);
    }
}

在这种情况下,由于您已经声明了变量viz。 a和b作为最后一个 结果,两个值对于变量c都变为常数 这意味着对于变量c,a和b的值将保持不变,并且已最终确定为20,该值在short数据类型的范围内(-32,768至32,767)。 因此,除非&保持值在范围内,否则不会有任何错误。

真实测试案例:

public class Demo 
{
    public static void main(String[] args) 
    {
        final int a=32768,b=32788;
        short c = (a<b)?a:b;
        System.out.println(c);
    }
}

编译该类并查看魔术! 您将再次遇到相同的错误。

为了进一步了解,请参考此处以大致了解情况。

故事的寓意:- 只是不要低估您的数据类型!

这是在Java语言规范§5.2分配上下文中指定的

分配上下文允许使用以下之一:

...

此外,如果该表达式是类型为byte,short,char或int的常量表达式(第15.28节):

  • 如果变量的类型为byteshortchar ,并且常量表达式的值可以表示为变量的类型,则可以使用缩窄的原始转换。

您在第二个代码段中使用的带有三元运算符的表达式是一个常量表达式,因为该表达式中使用的所有变量都是final 另外, short ,代表10 因此,允许从intshort原始转换变窄。

这很有道理,不是吗? 编译器了解最终变量的所有值,因此可以肯定地允许这样做。

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

short c = (short)((a<b)?a:b);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM