Java强制类型转换为什么会失败?

System.out.println((long)(46341*46341));
System.out.println((long)46341*46341);

如题,第二个能转换成功,第一个就会失败

System.out.println((long)(46341*46341)) => 并不是类型转换失败,这里先进行两个int类型的乘法,结果超过了int类型的取值范围,得到一个错误的值,再进行转换得到的值自然也是错的;

System.out.println((long)46341*46341) => 这个先进行了转换,再进行乘法时后面的int类型也自动转成long,结果不会溢出,所以转换成功了;

第一个式子把值改小点,结果在int范围内就能成功了;

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7627286
  • 这篇博客也不错, 你可以看下Java父类构造函数为什么会调用被子类重写的方法?为什么会先调用父类的构造函数
  • 同时,你还可以查看手册:java-学习Java语言 - 描述Java编程语言的基本概念和特点的课程。-面向对象的编程概念》教给你面向对象编程背后的核心概念:对象、信息、类和继承。本课最后向你展示这些概念如何转化为代码。如果你已经熟悉了面向对象编程,可以跳过本课。-什么是继承? 中的内容
  • 除此之外, 这篇博客: java枚举类及面试题为什么枚举实现单例模式是安全的?中的 为什么会有枚举类? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    假如说程序中有一些颜色的状态,或者说消息的类型等,在JDK1.5之前,只能用常量来进行表示

    public class TestEnum {
        public static final int RED = 1;
        public static final int BLACK = 2;
        public static final int GREEN = 3;
        public static void main(String[] args) {
            int num = 1;
            System.out.println(RED == num);
        }
    }
    //true
    

    num不是一个颜色,就与实际不太相符合,于是JDK1.5中引入了枚举类型

    enum EnumColor {
        RED, BLACK, GREEN;
    
        public static void main(String[] args) {
            EnumColor color = EnumColor.BLACK;
            switch (color) {
                case RED:
                    System.out.println("红色");
                    break;
                case BLACK:
                    System.out.println("黑色");
                    break;
                case GREEN:
                    System.out.println("绿色");
                    break;
            }
        }
    }
    //黑色
    
  • 您还可以看一下 朱祚华老师的微信小程序音乐播放器—Java实战一学就会课程中的 案例演示以及涉及知识点小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    问题标题: Java强制类型转换为什么会失败?

    具体例子:

    // 假设有一个父类Animal和两个子类Dog和Cat
    class Animal {}
    
    class Dog extends Animal {}
    
    class Cat extends Animal {}
    
    // 创建一个Animal类型的对象
    Animal animal = new Animal();
    
    // 将对象强制转换为子类类型
    Dog dog = (Dog) animal;
    

    上述代码尝试将父类Animal类型的对象强制转换为子类Dog类型的对象,在编译时不会出现错误,但在运行时会抛出ClassCastException,表示类型转换失败。

    问题解析和解决方案: 在Java中,强制类型转换存在失败的可能性,原因如下:

    1. 类型不兼容:
    2. 强制类型转换只能在父类和子类之间进行,或者实现了相同接口的类之间进行。如果两个类之间没有继承关系或者没有实现相同的接口,强制类型转换会失败。
    3. 在例子中,Animal类和Dog类之间是没有继承关系的,因此无法进行类型转换。

    解决方案: - 确保进行强制类型转换的类之间具有继承关系或实现了相同的接口。

    1. 转换源对象类型与目标类型不匹配:
    2. 强制类型转换要求转换源对象的实际类型必须是目标类型或其子类。如果源对象的实际类型与目标类型不匹配,强制类型转换会失败。
    3. 在例子中,animal对象的实际类型是Animal,而不是Dog,因此无法进行类型转换。

    解决方案: - 在进行强制类型转换前,使用instanceof运算符检查对象的实际类型是否与目标类型匹配。 - 修改示例代码如下:

    Animal animal = new Animal();
    if (animal instanceof Dog) {
        Dog dog = (Dog) animal;
        // 现在可以进行类型转换并使用转换后的对象了
    } else {
        // 处理类型转换失败的情况
    }
    

    以上是解决强制类型转换失败的常见情况和解决方案。如果遇到其他特殊情况,请提供更具体的代码示例,以便我能够提供更准确的解答。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^