首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不能将类转换为子类吗?

不能将类转换为子类吗?
EN

Stack Overflow用户
提问于 2014-03-05 07:00:47
回答 5查看 2.2K关注 0票数 2
代码语言:javascript
复制
class Mid1Prob1 {
    public static void main(String[] args) {
        System.out.println("Testing...");
        int x = 3;
        System.out.println(3);
        System.out.println((int) x); // legal to cast primitive value to the same type as itself
        System.out.println((long) x); // legal to cast primitive value to a super type
        System.out.println((short) x); // legal to cast a primitive value to a sub type, but may lose information

        Actual act = new Actual();
        System.out.println(((Actual) act) .x); // legal to cast a reference value to the same class as itself
        System.out.println(((Super) act) .x); // legal to cast a reference value to a superclass of itself, as long as the superclass is actually a superclass of the current class
        System.out.println(((Sub) act) .x); // run-time error, cannot cast a reference value to its subclass
    }
}

class Super {
    public int x = 999;
}

class Actual extends Super {
    public int x = 666; // variables can be public in package-private class
}

class Sub extends Actual {
    public int x = 333;
}

请检查main()方法的最后一行,并将其与上面段落的最后一行进行比较。为什么我不能将引用值转换为它的子类,而我可以将int转换为空呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-03-05 07:03:30

当你做的时候

代码语言:javascript
复制
(Sub) act

您正在告诉编译器(通过显式强制转换)相信您没有出错,因此它忽略了错误,并且在编译时没有检测到错误。但是当程序运行时,您将得到一个异常,因为actActual而不是Sub

票数 5
EN

Stack Overflow用户

发布于 2014-03-05 07:04:50

有许多类型的转换。在本例中,我们讨论的是缩窄本原转换 (int to short)和变窄参考转换 (父类型到子类型)。

为什么我不能将引用值转换为它的子类,但我可以将int转换为空值?

因为您的Actual对象不是Sub类型的,所以它不能用作Sub对象。

您可以始终从int转换到short,但可能会丢失有关该值的信息。转换按照Java语言规范中的描述进行

将有符号整数转换为整数类型T只会丢弃除n个最低阶位之外的所有位数,其中n是用来表示T型的位数,除了可能丢失关于数值大小的信息外,这还可能导致结果值的符号与输入值的符号不同。

票数 4
EN

Stack Overflow用户

发布于 2014-03-05 07:06:09

short不是int的子类。它们都是存储整数值的完全独立的方法;一种是2字节长,一种是4字节长(通常)。这就是为什么您能够将它们相互转换--将int转换为short将忽略int的上两个字节。但是,在另一种情况下,您可以想到拥有"is“关系的子类。ActualSuperSubActual。但是Actual不是Sub,这就是为什么您要得到错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22190812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档